Regex, чтобы разделить на пунктуацию, исключая URL - PullRequest
0 голосов
/ 30 октября 2009

Я пытаюсь разбить строку на пунктуацию, но строка может содержать URL-адреса (которые обычно содержат все типичные знаки препинания).

У меня есть базовые знания RegEx, но их недостаточно, чтобы помочь мне здесь. Вот что я использовал, когда обнаружил проблему:

$text[$i] = preg_split('/[\.\?!\-]+/', $post->text);

(это также учитывает несколько последовательных знаков пунктуации - эллипсы, !!!!, ????,?!? И т. Д.)

Как бы я разбил строку на пунктуацию при сохранении целостности URL? Спасибо!

Edit:

Мои извинения ... пример будет что-то вроде твита:

"Blah blah blah? A sentence. Here's a link: http://somelink.com?key=value ."

Результаты должны выглядеть примерно так:

[0] => "Blah blah blah?"
[1] => "A sentence."
[2] => "Here's a link: http://somelink.com?key=value ."

Ответы [ 3 ]

1 голос
/ 30 октября 2009

То, что вы здесь делаете, не вполне разделение на пунктуацию, потому что вы пытаетесь сохранить пунктуацию в одном из разделенных пунктов. Вы также пытаетесь отбросить пробел после этого, но, похоже, не учли это в своем вопросе.

Я бы решил это следующим образом: разбить входную строку с помощью регулярного выражения, которое соответствует пунктуации или URL, и сохранить части, включая разделители. Затем выполните итерации по элементам, и для каждого разделителя определите, была ли это пунктуация, в этом случае вы можете убрать конечный пробел и переместить его в конец предыдущего элемента, или в URL, в этом случае вы просто присоединяете его к предыдущему и следующие пункты.

В PHP вы можете хранить разделители, используя что-то вроде этого:

$text[$i] = preg_split('/([\.\?!\-]+|https?:\/\/\S+)/', $post->text, PREG_SPLIT_DELIM_CAPTURE);

, где флаг PREG_SPLIT_DELIM_CAPTURE объясняется в документации как:

Если этот флаг установлен, в скобках выражение в шаблоне разделителя будет также захвачен и возвращен.

0 голосов
/ 30 октября 2009

Это регулярное выражение приводит приведенный вами пример:

/(?<!http[^\s]{0,2048})[\.\?\!\-]+\B/

Он ищет ваш набор знаков препинания , а не , которому предшествует строка, начинающаяся с 'http' и заканчивающаяся символом пробела. Трейлинг \ B предотвращает расщепление дефисного слова

но ...

Этот вход:

Blah blah blah? A sentence. Here's a link: http://somelink.com?key=value.blah blah blah...

не будет разбивать value.blah на две части ... но я думаю, что регулярное выражение соответствия URL будет иметь ту же проблему, что и 'value.blah' , может быть частью действительного URL. Я думаю, что ваши данные, полученные от пользователей Твиттера, будут очень противоречивыми, и поэтому их будет сложно очистить, даже если вы воспользуетесь вторым предложением FrustratedWithFormsDes.

0 голосов
/ 30 октября 2009

Есть ли шаблон, по которому следуют ваши знаки препинания без URL? В большинстве английских предложений многие знаки препинания сопровождаются (или иногда предшествуют) пробелом. Я не знаю, на что похож ваш исходный текст, но это МОЖЕТ быть надежным способом сделать это, потому что знаки препинания в URL НЕ будут иметь пробелов с обеих сторон - хотя они могут ЗАВЕРШИТЬСЯ знаком препинания, за которым следует пробел - Я полагаю, это также зависит от URL, которые вы ожидаете.

Другой подход (если вы не возражаете делать это поэтапно) состоит в том, чтобы удалить все URL-адреса из строки, а затем выполнить остальную часть вашей обработки в результате этого. Это работает, только если вам не нужны URL-адреса. Если вам нужно сохранить URL-адреса, вы можете добавить строки-заполнители по обеим сторонам URL-адреса, такие как ">>>> http://placeholder.com<<<<", а затем при разделении на знаки препинания обязательно исключите любую точку, встречающуюся между> >>> и <<<<. После этого вам придется удалить >>>> и <<<< </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...