正则表达式拆分不包括URL的标点符号

时间:2009-10-30 03:27:32

标签: php regex

我正在尝试在其标点符号上拆分字符串,但字符串可能包含URL(方便地包含所有典型的标点符号)。

我对RegEx有基本的工作知识,但还不足以帮助我。这是我在发现问题时使用的内容:

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

(这也考虑了多个连续的标点字符 - 省略号,!!!!,????,?!?等)

如何在保持URL完整性的同时在标点符号上拆分字符串?谢谢!

修改

我道歉......一个例子就像推文一样:

"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 ."

4 个答案:

答案 0 :(得分:1)

你在这里做的不是完全分裂标点符号,因为你试图将标点符号保留在其中一个分割项目中。你之后也试图丢弃这个空格,但似乎没有在你的问题中覆盖它。

我将通过以下方式解决这个问题:使用与标点符号匹配的正则表达式拆分输入字符串,并保留各个部分,包括分隔符。然后迭代这些项目,并为每个分隔符决定它是否是标点符号,在这种情况下,您可以删除尾随空格并将其移动到上一个项目的末尾,或者URL,在这种情况下,您只需将其与前面的和以下项目。

在PHP中,您可以使用以下内容保留分隔符:

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

PREG_SPLIT_DELIM_CAPTURE标记解释为in the documentation为:

  

如果设置了此标志,则加括号   分隔符模式中的表达式   将被捕获​​并返回。

答案 1 :(得分:0)

是否存在非URL标点符号的模式?在大多数英语句子中,许多标点符号被空格字符跟随(或有时先于)。我不知道你的源文本是什么样的,但是这可能是一种可行的方法,因为URL中的标点符号在任何一方都没有空格 - 尽管它们可以用标点符号后跟空格结尾 - 我想这取决于你预期的网址。

另一个方面(如果您不介意分阶段执行此操作)是从字符串中删除所有URL,然后对此结果执行其余处理。只有在您不需要URL时才有效。如果您需要保留网址,可以在网址的任意一侧添加占位符字符串,例如“>>>> http://placeholder.com<<<<<”然后当您在标点符号上拆分时,请务必排除>>>>之间发生的任何关联。和<<<<之后,您必须删除>>>>和<<<<<

答案 2 :(得分:0)

这个正则表达式产生了你给出的例子:

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

它会查找标点符号 not ,前面是以“http”开头并以空格字符结尾的字符串。尾部\ B阻止带连字符的单词导致分割

但......

此输入:

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

不会将value.blah拆分为两个......但我认为网址匹配正则表达式会遇到与'value.blah' 成为有效网址一部分相同的问题。我认为来自Twitter用户的数据非常不一致,因此很难清理,即使你去了FrustratedWithFormsDes的第二个建议。

答案 3 :(得分:0)

你可以试试:

/((?![.?!] ).)+[.?!]+/