preg_replace - NULL результат? - PullRequest
       11

preg_replace - NULL результат?

3 голосов
/ 17 сентября 2009

Вот небольшой пример (скачайте, переименуйте в .php и выполните его в вашей оболочке):

test.txt

Почему preg_replace возвращает NULL вместо исходной строки?

\x{2192} соответствует HTML "→" ("→").

Ответы [ 4 ]

4 голосов
/ 29 августа 2013

Я получил нулевой ответ, когда мое регулярное выражение включало модификатор PCRE u UTF-8 . Если ваш исходный текст не UTF и у вас есть этот модификатор, вы получите нулевой результат.

2 голосов
/ 17 сентября 2009

Из документации на preg_replace () :

Возвращаемые значения

preg_replace () возвращает массив, если Параметр объекта представляет собой массив или иначе строка.

Если совпадения найдены, новый предмет будет возвращен, в противном случае тема будет возвращен без изменений или NULL, если произошла ошибка.

В вашем паттерне я не думаю, что флаг u поддерживается. НЕПРАВИЛЬНО

Редактировать: Кажется, что-то вроде проблемы с кодировкой субъекта. Когда я стираю «147 3,2 V6 - GTA (184 кВт)» и вручную набираю текст, кажется, все работает.

Редактировать 2: В предоставленном вами шаблоне есть 3 пробела, которые, похоже, создают проблемы для механизма регулярных выражений. Когда я конвертирую их в десятичную, их значение равно 160 (в отличие от обычного пробела 32). Когда я заменяю эти пробелы нормальными, это, кажется, работает.

Я заменил ошибочные пробелы на подчеркивания ниже:

'147 3.2 V6 - GTA (184 kW)'
'147 3.2_V6 - GTA_(184_kW)'
0 голосов
/ 18 сентября 2009
  • Вы используете одинарные кавычки, что означает, что единственное, что вы можете избежать, это другие одинарные кавычки. Чтобы включить escape-последовательности (например, \x32, затем использовать двойные кавычки "")
  • Я не эксперт по UTF8, но управляющий код \x2192 также неверен. Вы можете сделать: \x21\x92 чтобы получить оба байта в вашей строке, но вы можете посмотреть на utf8_encode и utf8_decode
  • В вашей исходной строке есть недопустимые символы или что-то в этом роде. PHP дает: Предупреждение: preg_replace (): Ошибка компиляции: неверная строка UTF-8 со смещением 0 в test.php в строке 7
0 голосов
/ 17 сентября 2009

Я полагаю, что в вашем выражении Regex также есть ошибка: ~\x{2192}~u

Попробуйте заменить то, что у меня есть, и посмотрите, сработает ли это для вас: /\x{2192}/u

...