2015-01-02 65 views
1

我試圖用PHP中的正則表達式匹配任何打開的HTML標籤,但input標籤除外。這是我的模式。PHP正則表達式匹配除一些標籤之外的HTML標籤名稱

/<([a-z]+)([^>]*>)?/i 

它匹配所有以下:

<input type="text"> 
<img src="> 
<a href=""> 
<button type="button"></button> 
<div id="some"></div> 
<p></p> 

我不想匹配input。我可能在將來排除更多標籤,因爲我在標題中聲明瞭某些標籤

What I've tried so far

[編輯]

按我的例子,我也想僅保留匹配的結果返回,如imgabuttondivp等標籤名稱

+0

添加[否定斷言(http://www.regular-expressions.info /lookaround.html)。 – mario

+1

Obligatory:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – PeeHaa

+2

**不要使用正則表達式來解析HTML。使用合適的HTML解析模塊**您無法可靠地使用正則表達式解析HTML,並且您將面臨悲傷和挫折。只要HTML從你的期望改變,你的代碼就會被破壞。請參閱http://htmlparsing.com/php或[this SO thread](http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php)如何使用已經編寫,測試和調試的PHP模塊正確解析HTML的示例。 –

回答

2
<(?:(?!input)[^>])*>(?:<\/[^>]*>)? 

試試看。

https://www.regex101.com/r/fG5pZ8/13

$re = "/<(?:(?!input)[^>])*>(?:<\\/[^>]*>)?/im"; 
$str = "<input type=\"text\">\n<img src=\">\n<a href=\"\">\n<button type=\"button\"></button>\n<div id=\"some\"></div>\n<p></p>"; 

preg_match_all($re, $str, $matches); 

編輯:

使用

(?!<input)<([A-Z0-9a-z]+)([^>]*>)? 

如果要單獨保存標籤。

https://www.regex101.com/r/fG5pZ8/16

2

使用negative lookahead(?!input\b)

<(?!input\b)([\w]+)([^>]*>)? 

要排除多個標籤,使用(?!(?:tag1|tag2|tag3|...)\b)

+0

現在OP說他不希望'inputasd'.newaz urs根據OP的原始問題是正確的 – vks

相關問題