Регулярное выражение PHP не работает со строкой из базы данных

#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, а не последовательность байтов.