我有一个简单的评论系统,人们可以在纯文本字段中提交超链接.当我将这些记录从数据库显示回网页时,我可以使用PHP中的RegExp将这些链接转换为HTML类型的锚链接吗?
我不希望算法使用任何其他类型的链接,只需http和https.
我正在遵循这个问题的建议:Robust,PHP的成熟HTML解析器,关于解析可能与DOMDocument格式错误的HTML .
是否有任何简单的方法来循环解析文档?所以我想像这样循环html.
$html='<ul>
<li>value1</li>
<li>value1</li>
<li>value3
<p>subvalue</p>
</li>
</ul>
<p>hello world</p>';
$doc = new DOMDocument();
$doc->loadHTML($html);
???
foreach (??? as $node)
{
print $node->nodeName.':'.$node->nodeValue;
}
Run Code Online (Sandbox Code Playgroud)
得到的结果有点像这样.
ul:
li:value1
li:value2
li:value3
p:subvalue
p:hello world
Run Code Online (Sandbox Code Playgroud)
单独使用$doc->childNodes并不能真正做到我想要的.因为它似乎没有下到树中的较低分支.我使用halfdan建议的代码,我得到这样的结果.
html:
html:value1
value1
value3
subvalue
hello world
Run Code Online (Sandbox Code Playgroud) 我有大量用户提交的内容.它是HTML,可能包含URL.其中一些<a>已经是(如果用户是好的)但有时用户是懒惰的,只需输入www.something.com或最好是http://www.something.com.
我找不到一个像样的正则表达式来捕获URL但忽略那些紧靠双引号或'>'的权利.谁有一个?
我试图转换,从textarea输入($_POST['content']),所有网址链接.
$content = preg_replace('!(\s|^)((https?://)+[a-z0-9_./?=&-]+)!i', ' <a href="$2" target="_blank">$2</a> ', nl2br($_POST['content'])." ");
$content = preg_replace('!(\s|^)((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$2" target="_blank">$2</a> ', $content." ");
Run Code Online (Sandbox Code Playgroud)
目标链接格式:www.hello.com或http(s)://(www).hello.com
但这似乎打破任何iframe,图像或类似,
正确的正则表达式如何忽略html标签中的url?
注意:我知道我需要两个表达式; 一个检测没有协议链接(比如www.hello.com,所以我需要预先添加)和另一个检测带协议的URL(所以不需要预先添加).
php ×4
regex ×3
preg-replace ×2
url ×2
domdocument ×1
html ×1
hyperlink ×1
linkify ×1
loops ×1