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 的首页编辑内容页面,经批准的用户可以在其中发布文章。我想在我的正则表达式上应用的那个字符串来自:

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

它生成这个 HTML:

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

3 回答 3

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 时。

于 2013-01-08T19:31:27.950 回答
4

正则表达式很好。preg_replace 不改变 $input 变量。

尝试

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

不要使用正则表达式来解析 HTML

于 2013-01-08T19:29:52.267 回答
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,而不是试图强迫它变成这样的形状。

于 2013-01-08T19:41:17.520 回答