preg_replace 和隐藏字符或隐藏编码
preg_replace and hidden chars or hidden encoding
我有一个 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: 当我使用给定的变量时它不起作用。但是当我将该变量回显到浏览器时,将文本复制到一个新变量,它就起作用了。那里隐藏着什么?
现在上面的表达式匹配编码为“\n”的换行符。但是,根据环境,换行符也可以编码为“\n”、“\r”和“\r\n”。所以你应该使用:
而不是 \n
[\n\r]+
另见 this question and the corresponding article on Wikipedia。
我有一个 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: 当我使用给定的变量时它不起作用。但是当我将该变量回显到浏览器时,将文本复制到一个新变量,它就起作用了。那里隐藏着什么?
现在上面的表达式匹配编码为“\n”的换行符。但是,根据环境,换行符也可以编码为“\n”、“\r”和“\r\n”。所以你应该使用:
而不是 \n[\n\r]+
另见 this question and the corresponding article on Wikipedia。