2013-01-08 62 views
0

如何使用RegEx查找<a class="modal>並將其替換爲<a class="modal-link"使用正則表達式重命名類

我想:

preg_replace('/<a class="(.*?)">(.*?)<\/a>/i', '<a class="$1-link">$2</a>', $input); 

,但它不工作。請有人能指出我正確的解決方案嗎?

順便說一句:我造型的Joomla 2.5 frontpage編輯內容頁面,其中批准的用戶可以發佈文章。這字符串,其中我想申請在我的正則表達式來源於:

<?php echo $this->form->getInput('image_intro', 'images'); ?> 

它生成此HTML:

<a class="modal" ...>Choose</a> 
+4

提供一些示例輸入和解釋爲什麼它不起作用 - 我猜這是因爲你正在嘗試跨多行查找文本。另外,你打開一個非正則表達式的解決方案,因爲像DOMDocument這樣的DOM解析器在這裏更合適。 – nickb

+0

可以ü告訴DOMDocument和RegEx在PHP中有什麼區別? – aspirinemaga

+1

我建議*不*在這裏使用正則表達式。正如你在問題中發佈的那樣,''標籤不僅僅是一個'class'屬性。我建議使用DOM解析器。 –

回答

4

正則表達式的罰款。 preg_replace不會更改$輸入變量。

嘗試

$new_string = preg_replace('/<a class="(.*?)">(.*?)<\/a>/i', '<a class="$1-link">$2</a>', $input); 

不要用正則表達式中使用PHP的DOMDocument類來解析HTML

+0

@RocketHazmat ,完全同意你的看法。但問題的標題是「使用正則表達式重命名類」。當然,正確的解決方案是使用DOM解析器 – KryDos

1

沒有辦法的可靠,或令人滿意,使用正則表達式做這件事,但如果粗搜索和替換是好的,你在做什麼,那麼就可以做到:

$code = '<a class="modal">Choose</a>'; 
$regex = '/(?<=\sclass=")modal(?="[\s>])/'; 
echo preg_replace($regex, 'modal-link', $code); 

有至少有兩個原因,這是一個糟糕的主意,通過:

  1. 你不應該使用正則表達式解析或修改HTML。解析或修改HTML不是一個常見問題,它是一個相當複雜和複雜的問題。使用正則表達式就像在使用鑿子時使用大錘。

  2. 在任何情況下,您都不應該修改HTML代碼。 HTML應該只是HTML。如果你需要你的HTML不同,那麼你應該在源代碼中更改HTML,而不是像這樣強制它變成形狀。

+0

謝謝你的回答Sverri – aspirinemaga