Str_замінити для декількох елементів


115

Я пам’ятаю, що робив це раніше, але не можу знайти код. Я використовую str_replace для заміни одного символу, як це: str_replace(':', ' ', $string);але я хочу замінити всі наступні символи \/:*?"<>|, не роблячи str_replace для кожного.


2
ви хочете замінити всі ці символи пробілом?
Книга Зевса

7
Не бійтеся посилатися на чудовий посібник із php.net та перегляньте розділ парам, щоб побачити, чи можливо те, що ви хочете.
Майк Б

Відповіді:


117

str_replace() може взяти масив, щоб ви могли:

$new_str = str_replace(str_split('\\/:*?"<>|'), ' ', $string);

Ви також можете використовувати preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);

2
Якщо припустити, що ОП означало, що зворотну косу рису слід замінити, що шаблон preg_replace не працює для мене. Щоб змусити зворотний кут працювати як слід, мені довелося використовувати 4 з них (тобто "\\\\") в шаблоні.
GreenMatt

1
Хороша відповідь, додавши @dogbert відповідь у зробить її повною для людей, які не читають посібник і не розуміють, що str_split повертає масив.
Бредмаж

Яка перевага str_replace()над preg_replace()(або навпаки) у випадку ОП?
ludditedev

1
@ludditedev Жодна реальна перевага - це лише питання переваги
NullUserException

1
@MadhurBhaiya Змініть регулярний вираз '~[\\+><-]~'(зверніть увагу, де -це). Dash ( -) - це метахарактер регулярних виразів, тому його потрібно уникати або стратегічно розміщувати в класі символів (усе всередині []). Дивіться цей відповідь: stackoverflow.com/a/7604888/396458
NullUserException

181

Подобається це:

str_replace(array(':', '\\', '/', '*'), ' ', $string);

Або в сучасному PHP (що завгодно від 5.4), трохи менш словесний:

str_replace([':', '\\', '/', '*'], ' ', $string);

73

Наприклад , якщо ви хочете замінити search1 заміною1, а пошук2 замінити2, наступний код буде працювати:

print str_replace(
    array("search1","search2"),
    array("replace1", "replace2"),
    "search1 search2"
);

// Вихід: заміна1 замінити2




2

Ви можете використовувати preg_replace () . Наступний приклад можна запустити, використовуючи командний рядок php:

<?php
$s1 = "the string \\/:*?\"<>|";
$s2 = preg_replace("^[\\\\/:\*\?\"<>\|]^", " ", $s1) ;
echo "\n\$s2: \"" . $s2 . "\"\n";
?>

Вихід:

$ s2: "рядок"


Занадто багато втече всередині класу персонажів. (див. прийняту відповідь)
mickmackusa

0

У мене виникла ситуація, коли мені довелося замінити теги HTML двома різними результатами заміни.

$trades = "<li>Sprinkler and Fire      Protection Installer</li>
<li>Steamfitter </li>
<li>Terrazzo, Tile and Marble      Setter</li>";

$s1 =  str_replace('<li>', '"', $trades);

$s2 = str_replace('</li>', '",', $s1);

echo $s2;

результат

"Установник дощування та пожежогасіння", "Steamfitter", "Терраццо, установник плитки та мармуру",


0

Я думаю, ви доглядаєте за цим:

// example
private const TEMPLATE = __DIR__.'/Resources/{type}_{language}.json';

...

public function templateFor(string $type, string $language): string
{
   return \str_replace(['{type}', '{language}'], [$type, $language], self::TEMPLATE);
}

0

У моєму випадку використання я параметризував деякі поля в HTML-документі, і як тільки я завантажую ці поля, я співпадаю та замінюю їх методом str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.