2015-03-08 3 views
1

Я пытаюсь заменить все целые слова в строке. Здесь есть похожие вопросы, такие как this и this.Заменить целое слово только с регулярным выражением или без него

Ответы на все эти вопросы рекомендуется использовать регулярные выражения, как это:

$needle = "a"; 
$haystack = "oh my dear a"; 
$haystack = preg_replace("/$needle\b/", 'God', $haystack); 
echo $haystack; 

Это хорошо работает для целых слов - вторит oh my dear God

Но если я заменю a с a. в обоих иголки и стога, я; е

$needle = "a."; 
$haystack = "oh my dear a."; 

выход становится oh my deGod a. потому . оценивается как регулярное выражение.

Я бы хотел, чтобы a. был заменен на God с или без регулярного выражения.

+0

вы избежали бы полной остановки –

+0

@ Дагон побега. в игле дает выход - о, моя дорогая. – oat

ответ

1

\b относится только к границам слов в восприятии ASCII. Также . является символом особого смысла в регулярном выражении — означает «любой одиночный символ (, кроме символа новой строки

Если «игла» может содержать специальные символы, используйте preg_quote() и создавать DIY границы.

preg_quote() принимает str и помещает обратную косую черту перед каждым символом, который является частью синтаксиса регулярных выражений. Это полезно, если у вас есть строка времени выполнения, которую нужно сопоставить в некотором тексте, и строка может содержать специальные символы регулярных выражений.

$str = preg_replace("~(?<=^|)" . preg_quote($needle, "~") . "(?= |$)~", 'God', $str); 
1

Может быть, это даст вам вдохновение ...

$haystack="oh my dear a." ; 
$needle="a" ; 
$hout=$haystack ; 
$hout=~ s/\b$needle\b\./God/g ; 

print "$haystack $needle $hout\n"; 

... производит этот выход ...

oh my dear a. a oh my dear God 

Это работает в Perl. Извините, мой php - путь ржавый.

Смежные вопросы