2013-01-02 102 views
1

我正在嘗試重做一些具有大寫字段名稱和空格的表單,其中包含數百個字段和50個表單...我決定嘗試編寫一個PHP腳本來解析HTML的形式。使用preg_replace查找和替換屬性

所以現在我有一個textarea,我將張貼HTML到,我想所有的字段名從

name="Here is a form field name" 

改變

name="here_is_a_form_field_name" 

如何在一個命令可以我通過解析並更改它,所以在名稱標籤中的所有將小寫和空格替換下劃線

我假設preg_replace與表達式?

謝謝!

+3

[你不應該用解析HTML正則表達式(http://stackoverflow.com/a/1732454/1607098)您也許要檢查[DOM](HTTP ://php.net/dom)而不是 – Touki

+0

我不會把PHP或正則表達式放在「最佳工具」列表的頂部。某種類型的DOM解析器似乎是更好的選擇(PHP確實有一個,但其他語言的DOM解析器更易於使用)。它可以用PHP/regex來完成,但是你所需要的正則表達式有多複雜取決於HTML包含的其他東西(特別是,除了表單字段以外是否有'name'屬性,如果是,你是否想要以處理它們)。最後,如果您向我們展示了您已經嘗試過的內容,這將有所幫助,因此我們可以幫助您進一步完善。 – SDC

回答

1

我同意preg_replace()或者說preg_replace_callback()是這個職位的合適的工具,這裏有一個如何使用它爲你的任務的例子:

preg_replace_callback('/ name="[^"]"/', function ($matches) { 
    return str_replace(' ', '_', strtolower($matches[0])) 
}, $file_contents); 

但是,您應該使用diff工具檢查結果,並在必要時對模式進行微調。

我推薦使用DOM解析器的原因是,它們通常會對無效的HTML或包含模板引擎示例標籤的文件加以遏制。

+2

我認爲「他們通常在無效的HTML上窒息」是一種好處。 –

8

我建議not using regex for manipulation of HTML ..我會用DOMDocument代替,像下面

$dom = new DOMDocument(); 
$dom->loadHTMLFile('filename.html'); 

// loop each textarea 
foreach ($dom->getElementsByTagName('textarea') as $item) { 

    // setup new values ie lowercase and replacing space with underscore 
    $newval = $item->getAttribute('name'); 
    $newval = str_replace(' ','_',$newval); 
    $newval = strtolower($newval); 
    // change attribute 
    $item->setAttribute('name', $newval); 
} 
// save the document 
$dom->saveHTML(); 

另一種方法是使用像Simple HTML DOM Parser這份工作 - 有關聯的網站上

一些很好的例子
0

這是您的解決方案:

<?php 
$nameStr = "Here is a form field name"; 

while (strpos($nameStr, ' ') !== FALSE) { 
    $nameStr = str_replace(' ', '_', $nameStr); 
} 
echo $nameStr; 
?>