0

我总是遇到正则表达式,但我并没有真正尝试理解和使用它们。但是我目前的项目迫使我使用正则表达式,所以我需要有人能给我正确的正则表达式来替换一个简单的字符串。基本上我正在替换从数据库中检索到的一小部分长文本。长文本只是一个带有文本锚的段落,其形式为:

<a href="example.com" title="blah3x">Example</a> 

所以问题是如何替换title属性的值?请注意,文本可能包含另外两个锚标记,因此我希望能够专门针对它们中的每一个。

编辑: 我想在此使用纯 PHP。我想我知道如何使用 js/jquery 来做到这一点。

4

3 回答 3

4
$doc = new DOMDocument();
$doc->loadHTML('<a href="example.com" title="blah3x">Example</a>');
$anchors = $doc->getElementsByTagName('a');
foreach ($anchors as $anchor)
{
    $anchor->setAttribute('target', '__blank');
}
$html = $doc->saveHTML();

echo $html;

看到它在行动

于 2013-06-01T03:24:27.380 回答
4

描述

您可以使用以下正则表达式执行此操作

(<a\b[^>]*?\btitle=(['"]))(.*?)\2

在此处输入图像描述

概括

  • (开始捕获组 1
  • <a\b使用开尖括号和a后跟一个分词
  • [^>]*?消耗所有非右尖括号字符...这会强制正则表达式留在锚标记内
  • \btitle=使用一个分词title=,这个分词有助于做一些额外的检查
  • (['"])捕获组 2,确保使用开放的单引号或双引号
  • )关闭捕获组 1
  • (.*?)开始捕获组 3,并且非贪婪消耗以收集引号内的所有文本
  • \2从捕获组 2 中引用回字符串,如果您使用单引号打开值,则需要单引号来关闭值。如果您使用双引号,则相同。

在替换命令中,我只是将找到的整个字符串替换为<a to the close quote:组捕获 1,然后是所需的文本,NewValue然后是组捕获 2 的右引号。

PHP 示例

<?php
$sourcestring="<a href="example.com" title="blah3x">Example</a>";
echo preg_replace('/(<a\b[^>]*?\btitle=([\'"]))(.*?)\2/im','\1NewValue\2',$sourcestring);
?>

$sourcestring after replacement:
<a href="example.com" title="NewValue">Example</a>

免责声明

由于通过 html 解析器解析文本不是所需的解决方案,因此我将跳过关于使用 Regex 解析 html 的常用肥皂盒免责声明。

于 2013-06-01T05:08:50.063 回答
1
$string=preg_replace(
'@<a (.*)title="(.*)"([^>]*)>(.*)</a>@iU',
'<a $1title="'.$replacement.'"$3>$4</a>',
$string);

请注意,i表达式末尾的 the 使其不区分大小写,而 theU使其不贪婪。

于 2013-06-01T05:03:01.727 回答