PHP preg_match_all и str_replace - PullRequest
       10

PHP preg_match_all и str_replace

1 голос
/ 23 января 2012

У меня есть небольшая проблема с preg_match_all и str_replace

<?
    $source = 'hello @user_name, hello @user_name2, hello @user_name3';
    preg_match_all("/@[\w\d_]*/s", $source, $search);
    foreach($search[0] as $result) {
        $source = str_replace($result, "<b>okay</b>", $source);
    }

    echo $source;
?>

результат (неправильный):

hello <b>okay</b>, hello <b>okay</b>2, hello <b>okay</b>3

правильный результат должен быть таким:

hello <b>okay</b>, hello <b>okay</b>, hello <b>okay</b>

кто-нибудь может помочь? Спасибо!

Ответы [ 2 ]

1 голос
/ 23 января 2012

Это происходит потому, что первое совпадение, @user_name, также будет соответствовать @user_name2 и @user_name3 (по крайней мере, часть @user_name). То, как вы это написали, работает так, как должно. Возможно, вы захотите посмотреть на preg_replace () . Для тестирования шаблонов регулярных выражений я всегда использую Мой тестер регулярных выражений (который на самом деле не мой, а только его название). Вот вывод этого сайта, полный сгенерированного кода:

Raw Match Pattern:
@[\w\d_]*

Raw Replace Pattern:
okay

PHP Code Example: 
<?php
$sourcestring="hello @user_name, hello @user_name2, hello @user_name3";
echo preg_replace('/@[\w\d_]*/s','<b>okay</b>',$sourcestring);
?>

$sourcestring after replacement:
hello <b>okay</b>, hello <b>okay</b>, hello <b>okay</b>
0 голосов
/ 24 января 2012

Ваша проблема не с preg_match_all или preg_replace. Проблема с str_replace. После того, как вы создали поисковый массив, первый токен содержит значение как «user_name», а функция str_replace заменяет все три вхождения из строки. поэтому значения 1 и 2 остаются такими же, как в строке.

Если вы измените свой источник на

$source = 'hello @user_name1, hello @user_name2, hello @user_name3';

все будет работать нормально. в противном случае вам нужно перебрать массив в обратном порядке

...