【问题标题】:preg_replace and hidden chars or hidden encodingpreg_replace 和隐藏字符或隐藏编码
【发布时间】: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 修饰符。
  • 有效,见ideone.com/BdG43Y
  • 是的,它在那里工作,就像它在 phpliveregex 上一样,就像我将文本放入变量时一样(抱歉,你是否阅读了整个问题?)。我更新了我的问题,看起来它与换行符有关,因为我与另一个正则表达式有类似的问题

标签: php regex preg-replace


【解决方案1】:

现在上面的表达式匹配编码为“\n”的换行符。但是,换行符也可以编码为“\n”、“\r”和“\r\n”,具体取决于环境。因此,您应该使用:

而不是 \n
[\n\r]+

另见this questionWikipedia上的相应文章。

【讨论】:

  • 感谢您的回答,我只是在几秒钟前通过使用 json_decode() 发现了它:) 但无论如何,您的回答是好的和正确的。对于其他有类似问题的人来说:在字符串上使用 json_decode() 会显示所有隐藏的字符
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 2011-04-04
  • 2018-01-23
  • 2012-12-04
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多