2012-01-23 4 views
1

У меня есть небольшая проблема, о preg_match_all и str_replacePHP 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> 

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

ответ

1

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

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

привет Crontab, спасибо за советы. Я пытаюсь использовать '$ source = preg_replace ('/'.$ result.'/',' '. $ result.' ', $ source) ;, но результат такой же .. :( –

+0

Я хотел использовать 'preg_replace()' самостоятельно вместо использования 'preg_match_all()' и 'str_replace()' в тандеме. – Crontab

+0

hmm, если я не использую 'preg_match_all', я не знаю, в какую строку следует символ' @ ', который должен быть заменен на ...? Как это? –

0

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

Если вы меняете источник,

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

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