Moe*_*Moe 3 php regex url preg-replace preg-match
我正在尝试使用PHP为聊天客户端实现非常宽松的Regex匹配.
聊天客户端必须能够获取完整和不完整的URL.
例如:
http://www.example.com
或www.example.com或example.com
我已经设置了一个试图实现这个目的的preg_replace:
$find = array("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/is","/(^(?!http:\/\/)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/?\S*)?)/is");
$replace = array( "<a target=\"_blank\" href=\"http://\\1\">\\1</a>","<a target=\"_blank\" href=\"\\1\">\\1</a>");
$output = preg_replace($find, $replace, $input);
Run Code Online (Sandbox Code Playgroud)
因此,目标是首先找到带有协议的"完整"URL,然后尝试查找没有协议的"懒惰"URL.
目前它适用于"完整"网址,但"懒惰"网址无法获取.
任何帮助将不胜感激.
谢谢.
我刚才建立了类似的东西.我的想法是......以协议标识符或"www"开头的任何内容都是一个URL,以及与以有效TLD(两个字母或已知gTLD)结尾的域相匹配的任何内容(如果后跟路径).域本身就是域.
$gtlds="com|net|org|biz|edu|gov|int|pro|xxx";
$gtlds+="|aero|arpa|asia|coop|museum|name|travel";
#$gtlds+="|xn-[a-z0-9]+";
$a = array(
'/(f|ht)tps?:\/\/[^ ]+/',
'/(ftp|www)\.[a-z0-9.-]+(/[^ ]*)/',
"/([a-z0-9][a-z0-9-]*\.)+([a-z]{2}|$gtlds)\/[^ ]*/"
);
Run Code Online (Sandbox Code Playgroud)
请注意,我是一个老式的正则表达式用户,所以这是ERE,而不是所有孩子们现在使用的那种花哨的PREG东西.
荒谬的gTLD列表来自IANA.我已经对它进行了更新,因此除了这个答案之外它的有效时间是有效的.XN--*.您可以根据需要包含以TIP开头的TLD列表.XN--,无论是使用模式还是直接匹配它们并增加$gtlds变量.我从来没有遇到任何因忽略它们的存在而引起的问题,所以这就是我的策略.
以上RE适用于我的具体用途.我没有声称他们会为每一个不属于我的案件工作.(例如,如果引用域或URL,它们将包括尾随引号.这绝不是我必须处理的事情,因此我没有处理它.)
请注意,当您进行替换时,虽然您希望生成器锚点的HREF属性是您匹配或生成的URL,但您可能希望保留原始文本,以便进行布局和显示.
根据你如何使用这些,字边界可能会有所帮助......但你已经知道如何做到这些.
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |