我正在尝试在其标点符号上拆分字符串,但字符串可能包含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 ."
答案 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)
你可以试试:
/((?![.?!] ).)+[.?!]+/