2013-09-02 2 views
0

Я создаю скрипт, который разрезает ненужные части строки, но оставляет остальную часть. У меня странная проблема - созданное мной регулярное выражение соответствует строке, но не для всех возможных знаков.PHP Regex не соответствует всему возможному слову

Испытано строка:

$itemFullName = "10-16X4 POLI MG SELF START BLK PLASTIC"; 

"Узор" Я:

POLI MG FT SDS BLK ZC 

PHP код:

if(preg_match("@(POLI){1}(.)+(BLK)@", $itemFullName)) 
{ 
    $itemAttributes = preg_replace("@(POLI){1}(.)+(BLK)@", "#", $itemFullName); 
} 

И Finaly $ itemAttributes установлен на:

"10-16X4 #K PLASTIC". 

Похоже, что только для регулярного выражения [POLI MG SELF START BL] K заменяет его на «#» вместо целого матча POLI MG SELF START BLK и замените его.

Как это исправить?

+0

'$ itemFullName =" 10-16X4 POLI MG SELF START BLK PLASTIC "; $ itemAttributes = preg_replace ("@ (POLI) {1} (.) + (BLK) @", "#", $ itemFullName); echo $ itemAttributes; 'Это работает для меня, возвращая' 10-16X4 # PLASTIC', как и ожидалось. – JTC

+0

[Работает для меня] (http://3v4l.org/s7ODI) (хотя это ужасно неэффективно) – DaveRandom

+0

Работает для меня тоже. – Toto

ответ

0

Нет необходимости запускать preg_match до preg_replace. Если шаблон не соответствует, вы вернетесь к исходной строке, возвращенной с preg_replace. Кроме того, ваш регулярное выражение должно быть упрощено тоже попробовать этот код:

$itemAttributes = preg_replace('@\bPOLI\b.*?\bBLK\[email protected]', '#', $itemFullName); 

Я обернутый начала и окончания строки в \b (границы слов), чтобы избежать согласования неожиданных матчей, как POLICY

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