正则表达式语法问题 - 试图理解

时间:2011-06-30 07:54:15

标签: php regex

我是一名自学成才的PHP程序员,我现在才开始掌握正则表达式的东西。当它正确完成时,我非常清楚它的功能,但这也是我需要深入研究的。所以也许有人可以帮助我,并为我节省数小时的实验。

我有这个字符串:

here is the <a href="http://www.google.com" class="ttt" title="here"><img src="http://www.somewhere.com/1.png" alt="some' /></a> and there is <a href="#not">not</a> a chance... 

现在,我需要preg_match此字符串并搜索其中包含图片的a href标记,并将其替换为具有较小差异的相同标记:在其中的title属性之后标记,我想添加rel="here"属性。 当然,它应该忽略内部没有a href标记的链接(img)。

3 个答案:

答案 0 :(得分:6)

首先:never ever ever use regex for html

使用XML解析器要好得多:创建DOMDocument,加载HTML,然后使用XPath获取所需的节点。

这样的事情:

$str = 'here is the <a href="http://www.google.com" class="ttt" title="here"><img src="http://www.somewhere.com/1.png" alt="some" /></a> and there is <a href="#not">not</a> a chance...';
$doc = new DOMDocument();
$doc->loadHTML($str);
$xpath = new DOMXPath($doc);
$results = $xpath->query('//a/img');
foreach ($results as $result) {
    // edit result node
}
$doc->saveHTML();

答案 1 :(得分:1)

理想情况下,您应该使用HTML(或XML)解析器来实现此目的。以下是使用PHP built-in XML manipulation functions的示例:

<?php
error_reporting(E_ALL);
$doc = new DOMDocument();
$doc->loadHTML('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><body>
<p>here is the <a href="http://www.google.com" class="ttt" title="here"><img src="http://www.somewhere.com/1.png" alt="some" /></a> and there is <a href="#not">not</a> a chance...</p>
</body></html>');
$xpath = new DOMXPath($doc);
$result = $xpath->query('//a[img]');
foreach ($result as $r) {
    $r->setAttribute('rel', $r->getAttribute('title')); // i am confused whether you want a hard-coded "here" or the value of the title
}
echo $doc->saveHTML();

输出

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><body>
<p>here is the <a href="http://www.google.com" class="ttt" title="here" rel="here"><img src="http://www.somewhere.com/1.png" alt="some"></a> and there is <a href="#not">not</a> a chance...</p>
</body></html>

答案 2 :(得分:0)

这里有一些链接可以帮助你使用Regex:

RegEx Tutorial

Email Samples of RegEx

我在上一份工作中广泛使用了最后一个链接中的网站。这是一个很好的RegEx集合,您也可以根据您的具体情况进行测试。 前两个链接可以帮助您找到更多有关它的知识。