【发布时间】:2016-11-29 15:16:01
【问题描述】:
我有一个 preg 替换模式,在 phpliveregex.com 上效果很好:
(\>*\s?)_______________________________________________\n(\>*\s?)(talk|tagging|talk-us|talk-gb|talk-de|osm-talk) mailing list\n(\>*\s?)(talk|tagging|talk-us|talk-gb|talk-de|osm-talk)@openstreetmap.org\n(\>*\s?)https://lists.openstreetmap.org/listinfo/(talk|tagging|talk-us|talk-gb|talk-de|osm-talk)
例如这里,它会删除所有的邮件列表签名:
>> Text, blablabla
>>
>> _______________________________________________
>> talk mailing list
>> talk@openstreetmap.org
>> https://lists.openstreetmap.org/listinfo/talk
>
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>talk mailing list
>talk@openstreetmap.org
>https://lists.openstreetmap.org/listinfo/talk
--
personal signature, blabla._______________________________________________
talk mailing list
talk@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk
但是当我在 php 中使用 preg_replace 尝试完全相同时,只有三个邮件列表签名中的最后一个被删除。这仅适用于给定的变量。当我将变量内容回显到浏览器并将其复制到新变量(如$text = 'long echoed text')时,它可以工作。
$slugs = 'talk|tagging|talk-us|talk-gb|talk-de|osm-talk';
$pattern = '!(\>*\s?)_______________________________________________\n(\>*\s*)('.$slugs.') mailing list\n(\>*\s*)('.$slugs.')@openstreetmap.org\n(\>*\s*)https://lists.openstreetmap.org/listinfo/('.$slugs.')!mi';
return preg_replace($pattern,'',$text);
所以我猜在原始变量中一定有一些隐藏的编码或隐藏的字符。但是我怎样才能找出问题所在呢?
编辑:它现在看起来像是换行符和之后的> 有问题,但我仍然不知道如何准确检查它以及如何解决它。
edit2:当我尝试 $text==$text2(其中 $text 是原始 $text2 是 echo $text 的结果)时,我得到 FALSE
TL;DR:当我使用给定的变量时,它不起作用。但是当我将变量回显到浏览器时,将文本复制到一个新变量中,它就可以工作了。里面藏着什么?
【问题讨论】:
-
如果编码有问题,请尝试使用 u 修饰符。
-
是的,它在那里工作,就像它在 phpliveregex 上一样,就像我将文本放入变量时一样(抱歉,你是否阅读了整个问题?)。我更新了我的问题,看起来它与换行符有关,因为我与另一个正则表达式有类似的问题
标签: php regex preg-replace