正则表达式破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

回到顶部