регулярные выражения заменяют базовые @username и #hashtag на некоторые особые случаи - PullRequest
1 голос
/ 10 декабря 2011

Застрял в новом случае в матче регулярных выражений ... У меня есть строка, содержащая слова, #hashtags, @useranmes и другие разные символы.

Некоторые примеры того, как они становятся все более и более грязными. «Мой новый автомобиль» часто необязателен и не существует, так как это замена preg, я заканчиваю пустой строкой, что в моем случае желательно. Но если «Мой новый автомобиль» существует, это будет желаемая строка

  1. Мой новый автомобиль # колеса # автомобиль # авто # драйв # выходные
  2. Мой новый автомобиль # колеса # автомобиль # авто # привод # выходные @ я
  3. Мой новый автомобиль # колеса, # автомобиль, # авто, # драйв, # выходные
  4. Мой новый автомобиль # колеса, # автомобиль, # авто, # привод, # выходные, @me (Все вышеперечисленное, без «Моего нового автомобиля», обычная путаница с двойным интервалом и т. Д.) (Тогда люди становятся модными и добавляют смайлики в строку
  5. Мой новый автомобиль # колеса #car \ ud83d \ ude2d \ ude2d \ ud83d \ ude2d \ ud83d \ ude02

Желаемый результат: 1. Моя новая машина 2. Мой новый автомобиль 3. Мой новый автомобиль 4. Моя новая машина 5. Мой новый автомобиль

Я неплохо справился с (^|\s)[#@](\w+), а затем в игру вступили эмодзи, а также забавные квадраты, которые представлены как \ ue412 \ ue412

Я думаю, мне нужно только найти способ сказать, если начинается с \ удалить до конца. Я думал пойти другим путем и отрицать что-нибудь, не [a-zA-Z0-9], но это также многоязычный.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

Функция json_decode преобразует escape-последовательности ascii в действительные символы Unicode UTF-8.

$t = "My New Car #wheels #car \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d\ud83d\ude02";
$s = json_decode("\"$t\"");
var_dump($s);

Вывод:

string(40) "My New Car #wheels #car ????"

Для учета этих символов в preg_replace вам нужно включить /u флаг Unicode

$r = preg_replace("/\s*([#@]\S+|[^\\x00-\\xff])\s*/u", "", $s);
var_dump($r);

Вывод:

string(10) "My New Car"

Код выхода \x из 0-127 (hex 00-ff) соответствует asciiперсонажи.Все, что выше \xff, является символом utf-8.

0 голосов
/ 10 декабря 2011

Попробуйте:

(?:[#@]\S+|\\\S+)

работает со всеми вашими примерами, включая «грязный».

...