Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 讨厌的正则表达式和奇怪的字符串行为_Php_Regex - Fatal编程技术网

Php 讨厌的正则表达式和奇怪的字符串行为

Php 讨厌的正则表达式和奇怪的字符串行为,php,regex,Php,Regex,我已经为这个问题挣扎了很长一段时间,但我似乎找不到解决办法。我有下面的正则表达式来匹配URL,在我在新行上发布一堆链接之前,它们之间没有空格 (http | ftp)+(s):(\/\/)(\w |\.\124;\-)+(\/)?(\ s)+ 我在几个regex测试人员中尝试了这一点,与我的应用程序中的代码不同,它似乎正确地选择了URL。这让我觉得代码一定出了问题,于是我开始调试。当我将正则表达式应用于字符串时,我发现: http://www.google.com/\r\nhttp://www.

我已经为这个问题挣扎了很长一段时间,但我似乎找不到解决办法。我有下面的正则表达式来匹配URL,在我在新行上发布一堆链接之前,它们之间没有空格

(http | ftp)+(s):(\/\/)(\w |\.\124;\-)+(\/)?(\ s)+

我在几个regex测试人员中尝试了这一点,与我的应用程序中的代码不同,它似乎正确地选择了URL。这让我觉得代码一定出了问题,于是我开始调试。当我将正则表达式应用于字符串时,我发现:

http://www.google.com/\r\nhttp://www.google.com/\r\nhttp://www.google.com/

我从未见过新行
\r\n
在浏览器中显示为文本。这让我觉得有别的东西抓住了这根绳子。我遵循了我的逻辑,结果证明这个字符串正好从
textarea
元素进入
$\u POST
中,并且没有在任何地方被操纵

是什么原因导致这些
\r\n
显示为文本,我将如何匹配用户可能输入的URL,这些URL以新行分隔

我真的有点绝望,我真的很感激你们的帮助。

如果你们看到

http://www.google.com/\r\nhttp://www.google.com/\r\nhttp://www.google.com/

当您回显字符串时,这意味着您要回显的实际字符串是:

http://www.google.com/\\r\\nhttp://www.google.com/\\r\\nhttp://www.google.com/

i、 e.反斜杠已转义,导致它们不被视为换行符。这意味着您在正则表达式中只得到一个匹配项


检查此问题:了解您的请求可能被转义的原因。

我无法复制。使用您的regexp模式和文本,
preg\u match\u all
可以很好地抓取这三个。请参见此处:@strustmaster抱歉,我认为它足够清楚,我编辑了问题\r\n是windows换行符。因此,windows用户在文本区域中键入并添加换行符将导致该问题。您如何应用正则表达式?您正在使用
preg_match_all
对吗?@jszobody正如我所说的,我也在一对在线regex测试仪和一个php沙箱中尝试了这个方法,它确实如预期的那样工作,但在我的托管服务器上没有。这是这样一个完全正确的画法,我只得到一个匹配,这是所有URL作为一个整体的字符串。问题是我没有逃逸那个字符串,那些额外的反斜杠怎么会自己出现?是的,所以问题与正则表达式无关,但在代码中的其他地方,我们没有看到字符的逃逸发生。啊,天啊,我怎么可能没有看到这种情况。字符串实际上正在另一个方法中转义。但如果不是你的建议,我永远也不会发现这一点。非常感谢。