2013-04-04 30 views
0

我有一段HTML代碼字符串:PHP正則表達式中任何字符的正確語法是什麼?我的例子不工作

<input id="an_id" name="a_name" value="some_value" class="a_class" type="text"/> 

我想擺脫的name屬性以及其與正則表達式和preg_replace函數值:

preg_replace('/name\="(.*)"/', '', $html, 1); 

但此輸出:

<input id="an_id" /> 

任何人都可以幫助我嗎?爲什麼它會刪除那麼多?正則表達式是name屬性和(.*)因爲我不在乎什麼字符值。可以有任何東西。

+1

[不要使用分析HTML正則表達式(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 ) – 2013-04-04 19:46:46

+2

@JohnConde整個頁面?是的,主意不好。像這樣的單個標籤?爲什麼不? – Sammitch 2013-04-04 20:00:01

回答

1

您無法匹配任何字符,您正在尋找除"以外的許多任何字符。另外,捕獲組()不是必需的,因爲您沒有使用替換中的值,並且我不知道您爲什麼要轉義=,因爲它不是特殊字符。

preg_replace('/name="[^"]*"/', '', $html, 1); 
+0

=的轉義是由preg_quote()創建的我認爲。 – tester 2013-04-04 20:00:02

+0

那麼,文檔說它會做到這一點。儘管'='只出現在前瞻中,但它仍然是奇怪的,但它是3個字符序列中的第三個字符,「(?= ...)',我不明白它爲什麼需要轉義......但這就是PHP開發人員心中所發生的事情的奧祕。 – Sammitch 2013-04-04 20:05:59

1

讓它ungreedy(見Possible Modifiers):

preg_replace('/name\="(.*)"/U', '', $html, 1); 

結果:

<input id="an_id" value="some_value" class="a_class" type="text"/> 

或者像@約翰孔德評論,請使用DOM Parser

1

原始的,但它應該讓你去。

<?php 
function remove_attribute($attribute, $html) { 
    return preg_replace(
     sprintf('~%s="[^"]+"\s?~', preg_quote($attribute)), 
     null, 
     $html 
    ); 
} 

$html = '<input id="an_id" name="a_name" value="some_value" class="a_class" type="text"/>'; 
echo remove_attribute('name', $html); 
/* 
    <input id="an_id" value="some_value" class="a_class" type="text"/> 
*/ 
相關問題