Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
Regex 正则表达式是否替换文本中的url?_Regex_Url - Fatal编程技术网

Regex 正则表达式是否替换文本中的url?

Regex 正则表达式是否替换文本中的url?,regex,url,Regex,Url,目前正在使用此: MatchCollection urlRegExp = Regex.Matches(text, @"https?://(?:www\.)?[a-zA-Z0-9/;&=:_$+!*'()|~\[\]#%.\\-]+"); 替换文本中的URL,但它并没有得到所有URL,而且似乎我找不到一个好的正则表达式。。任何人都可以提供帮助?如果你需要在文本中查找URL,你不需要符合RFC(无论数字是多少),这是完全没有用的(而且遵循标准的模式几乎是不可能的,它会太慢,太复杂) 文本中

目前正在使用此:

MatchCollection urlRegExp = Regex.Matches(text, @"https?://(?:www\.)?[a-zA-Z0-9/;&=:_$+!*'()|~\[\]#%.\\-]+");

替换文本中的URL,但它并没有得到所有URL,而且似乎我找不到一个好的正则表达式。。任何人都可以提供帮助?

如果你需要在文本中查找URL,你不需要符合RFC(无论数字是多少),这是完全没有用的(而且遵循标准的模式几乎是不可能的,它会太慢,太复杂)

文本中的所有URL都应该被认为是有效的(和/或必须在生成此文本的人插入文本之前进行验证或不验证。换句话说,这不是你的工作!)

所以,你必须找到另一种方法。要做到这一点,您必须提出正确的问题:如何区分URL和文本

让我们列出共同的标准

  • URL可以以协议开头:http、https、ftp、sftp、ftps、gopher等
  • URL可以以
    www.
  • URL不包含空格字符
  • URL总是以单词边界开头
  • URL可能在空白字符、字符串结尾、除问号之外的标点字符之前结束(即使没有GET参数也可能出现)
有了这些要求,您可以轻松地为http协议构建一个简单的模式:

\b(https?://|www\.)\S+(?=\s|[^\P{P}?]|\z)

请注意,一旦获得结果,您可以使用内置函数(通常不会处理所有情况,但现在您知道原因:)检查url的有效性。

您使用的平台可能存在重复?@PM77-1:他/她不会尝试检查url是否有效,而只是在文本中查找url,这是两个完全不同的任务。@pmu-r-rite,我相信这是同一个任务。有什么区别?如果子字符串与url匹配,则作业完成一半。只需要替换替换字符。是的,但它是否适用于我不知道的url,例如,如果url是类似的东西:testone123.me或类似的东西。@user3352374:可能,但无法知道“testone123.me”是域名(扩展为url)还是简单的文本元素。例如,如果您构建一个模式来检测:
\b\w+\.\w+
,所有看起来像这样的子字符串都将匹配,您将获得假阳性结果。(想象有人在一个点后忘记了一个空格:
鲍勃养了一只猫。我养了一只狗。
是的,但是你刚才给我的代码会检测到facebook url或类似的东西吗?test123.me/fsifi8e3393呢?:O@user3352374:在当前状态下,显然不是。请记住,我的方法是自愿的,只会检测substrin以
http://
www
开头的gs(换句话说,这将检测编写URL的意图,仅此而已)。如果要检测不带
http://
www
但具有已知域的URL,也可以在模式中包含它们,并进行替换:
\b(https?://www\.| domain1\.com | domain2\.com)S*(?=\S |[^\P{P}]|\z)
。但通过语法分析查找隐藏在文本中的所有可能URL确实是(在我看来)浪费时间。特别是,我想到了90年代那些试图禁止用户在帖子中写入url的论坛。检测url的模式或字符串搜索是基于
http://
子字符串的。紧接着,想要在帖子中写入url的人会写:
h**p://
,以避免检测。