一个错误我看到人们做了,并再次试图解析XML或HTML用正则表达式.以下是解析XML和HTML很难的几个原因:
人们希望将文件视为一系列行,但这是有效的:
<tag
attr="5"
/>
Run Code Online (Sandbox Code Playgroud)
人们希望将<或<tag视为标记的开头,但是这样的东西存在于野外:
<img src="imgtag.gif" alt="<img>" />
Run Code Online (Sandbox Code Playgroud)
人们通常希望将起始标记与结束标记匹配,但XML和HTML允许标记包含自身(传统的正则表达式根本无法处理):
<span id="outer"><span id="inner">foo</span></span>
Run Code Online (Sandbox Code Playgroud)
人们通常希望匹配文档的内容(例如着名的"查找给定页面上的所有电话号码"问题),但数据可能会被标记(即使在查看时看起来是正常的):
<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>
Run Code Online (Sandbox Code Playgroud)
评论可能包含格式不正确或不完整的标记:
<a href="foo">foo</a>
<!-- FIXME:
<a href="
-->
<a href="bar">bar</a>
Run Code Online (Sandbox Code Playgroud)
你还知道其他什么问题?
我需要以不区分大小写的方式查找和替换所有文本匹配项,除非文本位于锚标记内 - 例如:
<p>Match this text and replace it</p>
<p>Don't <a href="/">match this text</a></p>
<p>We still need to match this text and replace it</p>
Run Code Online (Sandbox Code Playgroud)
搜索"匹配此文本"只会替换第一个实例和最后一个实例.
[编辑]根据戈登的评论,在这个例子中可能更喜欢使用DOMDocument.我对DOMDocument扩展并不熟悉,并且非常感谢这个功能的一些基本示例.
我需要用 内部HTML元素替换空格.例:
<table atrr="zxzx"><tr>
<td>adfa a adfadfaf></td><td><br /> dfa dfa</td>
</tr></table>
Run Code Online (Sandbox Code Playgroud)
应该成为
<table atrr="zxzx"><tr>
<td>adfa a adfadfaf></td><td><br /> dfa dfa</td>
</tr></table>
Run Code Online (Sandbox Code Playgroud) 我需要在href="之前添加http://如果http://不遵循href="或src="
以下代码部分有效.部分意味着它只考虑<a href="但不考虑src="
$str= preg_replace(
"/(?<!a href=\")((http|ftp)+(s)?:\/\/[^<>\s]+)/i",
"<a href=\"\\0\"> target=\"blank\">\\0</a>",
$str
);
Run Code Online (Sandbox Code Playgroud)
谢谢你们提前回复.
我找到了一个自动检测链接并将它们放在<a>标签中的解决方案:Regex PHP - 自动检测YouTube,图像和"常规"链接
相关部分(preg_replace_callback出于兼容性原因,我不得不在调用之外移动函数):
function put_url_in_a($arr)
{
if(strpos($arr[0], 'http://') !== 0)
{
$arr[0] = 'http://' . $arr[0];
}
$url = parse_url($arr[0]);
//links
return sprintf('<a href="%1$s">%1$s</a>', $arr[0]);
}
$s = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:\S+\.\S+)#', 'put_url_in_a', $s);
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,除非它偶然发现标签中的网址,然后将其标记为废弃(通过在其中添加另一个标记).它也破坏了嵌入式媒体.
问题:如何使用此函数排除HTML标记,希望只使用正则表达式?