Мне нужно сопоставить (без учета регистра) "abcd" и необязательный символ товарного знака
Регулярное выражение: /abcd(™)?/gi
См. Пример:
preg_match("/abcd(™)?/gi","AbCd™ U9+",$matches);
print_r($matches);
Когда я запускаю это, $matches ничем не заполняется ... Даже не создается как пустой массив. Есть идеи?






Я подозреваю, что это как-то связано с буквальным обозначением товарного знака.
Возможно, вы захотите узнать, как использовать Юникод с вашими регулярными выражениями, а затем встроить escape-последовательность для символ товарного знака.
Как кодируется ваш файл? У PHP есть проблемы с юникодом. В вашем случае попробуйте использовать escape-последовательность \x99 вместо прямого внедрения символа TM.
Примечание: Я не гуру PHP. Однако, похоже, это проблема кодировок символов. Например, ваш PHP-файл может быть закодирован как win-1252 (где ™ закодирован как \x99), а данные, которые вы пытаетесь сопоставить, могут быть закодированы как UTF-8 (где ™ закодирован как \xe2\x84\xa2), или наоборот ( т.е. ваш файл - UTF-8, а ваши данные - win-1252). Попробуйте посмотреть в этом направлении и расскажите нам больше о том, что вы делаете.
Это была комбинация вещей ... это было регулярное выражение, которое, наконец, сработало:
/abcd(\xe2\x84\xa2)?/i
Мне пришлось удалить модификатор /g и изменить символ tm на \xe2\x84\xa2.
Я не возражаю, если я потеряю репутацию или статус «избранного» ответа, правда. Я просто хотел бы напомнить людям, что «голосование за / против» означает «это было полезно / не помогло в отношении вопроса», а не «Мне нравится / не нравится ваш ответ» или что-то подобное. И когда вы голосуете против, оставьте комментарий, почему. Это правильно.