Почему это регулярное выражение не работает в PHP?

Мне нужно сопоставить (нечувствительный к регистру) "abcd" и необязательный символ товарного знака

Regex: /abcd(™)?/gi

См. пример:

preg_match("/abcd(™)?/gi","AbCd™  U9+",$matches);
print_r($matches);

Когда я запускаю это, $matches не заполняется ничем... Даже не создается как пустой массив. Любые идеи?

Ответ 1

Как закодирован ваш файл? У PHP возникают проблемы, когда дело доходит до unicode. В вашем случае попробуйте использовать escape-последовательность \x99 вместо прямого встраивания символа TM.

Ответ 2

Примечание: Я не являюсь гуру PHP. Однако это, похоже, проблема кодировок символов. Например, ваш файл PHP может быть закодирован как win-1252 (где ™ закодирован как \x99), а данные, которые вы пытаетесь сопоставить, могут быть закодированы как UTF-8 (где ™ кодируется как \xe2\x84\xa2), или наоборот (т.е. ваш файл UTF-8, а ваши данные - win-1252). Попробуйте искать в этом направлении и дайте нам больше информации о том, что вы делаете.

Ответ 4

Это была комбинация вещей... это было регулярное выражение, которое наконец-то сработало:

/abcd(\xe2\x84\xa2)?/i

Мне пришлось удалить модификатор /g и изменить символ tm на \xe2\x84\xa2.