使用正则表达式重命名类

时间:2013-01-08 19:22:52

标签: php regex html-parsing

我如何使用RegEx查找<a class="modal>并将其替换为<a class="modal-link"

我试过了:

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

但它不起作用。请有人指出我正确的解决方案吗?

顺便说一句:我正在设计Joomla 2.5首页编辑内容页面,批准的用户可以发布文章。我希望在我的正则表达式上应用的字符串来自:

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

它会生成此HTML:

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

3 个答案:

答案 0 :(得分:6)

使用PHP的DOMDocument类的基于非正则表达式的解决方案将是:

// Load up the HTML in DOMDocument
$doc = new DOMDocument;
$doc->loadHTML( '<a class="modal">Stuff</a>'); // Or: $doc->loadHTML( $this->form->getInput('image_intro', 'images'));

// Create a new XPath object to find the correct <a> tags
$xpath = new DOMXPath( $doc);

// Iterate over all <a class="modal"> tags
foreach( $xpath->query( "//a[@class='modal']") as $a) {
    // Set the class attribute correctly
    $a->setAttribute( 'class', $a->getAttribute( 'class') . '-link');
    echo $doc->saveHTML( $a); // Print the fixed <a> tag
}

这将输出类似于:

的内容
<a class="modal-link">Stuff</a>

此方法比基于正则表达式的方法更健壮,更稳定,尤其是当您从用户输入获取HTML时。

答案 1 :(得分:4)

Regexp很好。 preg_replace不会更改$ input变量。

尝试

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

但是不要使用常规表达式来解析HTML

答案 2 :(得分: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,而不是试图将其强制成这样的形状。