#php #regex
#php #регулярное выражение
Вопрос:
preg_replace
не возвращает желаемый результат, когда я использую его для строки, извлеченной из базы данных.
$result = DB::connection("connection")->select("my query");
foreach($result as $row){
//prints run-d.m.c.
print($row->artist . "n");
//should print run.d.m.c
//prints run-d.m.c
print(preg_replace("/-/", ".", $row->artist) . "n");
}
Это происходит только тогда, когда я пытаюсь заменить -
(dash). Я могу заменить любой другой символ.
Однако, если я попробую это регулярное выражение для простой строки, оно будет работать так, как ожидалось:
$str = "run-d.m.c";
//prints run.d.m.c
print(preg_replace("/-/", ".", $str) . "n");
Чего мне здесь не хватает?
Комментарии:
1. Если вы используете
'/p{Pd}/'
шаблон, соответствуете ли вы дефису / тире?2. нет, все еще выводит ту же строку
3. Тогда в строке может быть просто no
-
. Не уверен, что это может помочь, попробуйте также добавить/u
модификатор,/p{Pd}/u
.4. Можете ли вы показать точный результат?
5. Вероятно, то, что выглядит как тире, на самом деле является знаком минус или другим видом тире (которые могут быть разными символами).
Ответ №1:
Оказывается, у вас в строках есть тире в Юникоде. Чтобы сопоставить все тире в Юникоде, используйте
/[p{Pd}xAD]/u
Смотрите демонстрацию регулярных выражений
p{Pd}
Соответствует любому дефису в категории символов Unicode ‘Пунктуация, тире’, кроме мягкого дефиса, xAD
, поэтому его следует комбинировать с p{Pd}
в классе символов.
/u
Модификатор поддерживает шаблон Unicode и заставляет механизм регулярных выражений обрабатывать входную строку как последовательность кодовых точек Unicode, а не последовательность байтов.