正则表达式破HTML匹配
我想删除像破碎的HTML标签:正则表达式破HTML匹配
<p>right here</p>....<iframe class <b>Very nice</b>...<ifr
等我的把内容限制在HTML字符串脚本的休息和关闭是工作的罚款任何打开的标签,这破坏的标签将始终在字符串的结尾处。 到目前为止,我实现的是:
#<[^>]*#i
的问题是,它认为部分标签 <iframe
为好。
IFRAME只是举例...
编辑: 我的PHP版本不支持DOM文档,这就是为什么要对正则表达式。我已经实现了Closing open HTML tags用于关闭字符串中的任何打开标签,但它允许打破标签。
回答:
使用标准的PHP扩展总是最好的选择。但是,对于那些谁是同样的问题,并通过PHP版本的限制,这是一个完美的把长度限制在任何HTML字符串的函数:在我的情况完全工作
/** * Crops HTML text ensuring valid HTML
*
* @param string HTML string
* @param int The length up to which HTML string is to be limited
*/
protected function limitHtml($html, $length)
{
// Ignoring style tags for displayable string length
preg_match_all('/<style>(.*?)<\/style>/s', $html, $cssMatches);
$html = preg_replace('/<style>(.*?)<\/style>/s', '', $html);
// css
$css = '';
if (isset($cssMatches[1])) {
foreach ($cssMatches[1] as $cmatch) {
$css .= "<style>$cmatch</style>";
}
}
$truncatedText = substr($html, 0, $length);
$pos = strpos($truncatedText, ">");
if($pos !== false)
{
$html = substr($html, 0,$length + $pos + 1);
}
else
{
$html = substr($html, 0,$length);
}
// Relace The Broken Opened Tag From The the end of String
$lastCorruptopnArrow = strrpos($html, "<");
$lastCloseArrow = strrpos($html, ">");
if ($lastCloseArrow < $lastCorruptopnArrow) {
$corruptHTmlString = substr($html, $lastCorruptopnArrow, strlen($html) - $lastCorruptopnArrow);
$html = preg_replace('/'. preg_quote($corruptHTmlString, '/') . '$/', '', $html);
}
preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
$len_opened = count($openedtags);
if (count($closedtags) == $len_opened)
{
return $css . $html;
}
$openedtags = array_reverse($openedtags);
for ($i=0; $i < $len_opened; $i++)
{
if (!in_array($openedtags[$i], $closedtags))
{
$html .= '</'.$openedtags[$i].'>';
}
else
{
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
return $css . $html;
}
。打开以增强:limit_html()
回答:
您需要使用任何HTML解析器来获得正确的结果,但这是正则表达式的方法,您希望
(<\w+(?:\s+\w+=\"[^"]+\")*)(?=[^>]+(?:<|$))
demo and some explanation
使用
$res = preg_replace('/(<\w+(?:\s+\w+=\"[^"]+\")*)(?=[^>]+(?:<|$))/, '$1>', $str);
以上是 正则表达式破HTML匹配 的全部内容, 来源链接: utcz.com/qa/265888.html