我如何使用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>
答案 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);
至少有两个原因,这是一个坏主意,通过:
您不应使用正则表达式解析或修改HTML。解析或修改HTML不是常规问题,它是一个非常复杂和复杂的问题。使用正则表达式就像在使用凿子时使用大锤一样。
在任何情况下都不应修改HTML代码。 HTML应该只是HTML。如果您需要HTML不同,那么您应该在源代码处更改HTML,而不是试图将其强制成这样的形状。