使用正则表达式替换字符串

时间:2013-06-01 03:20:30

标签: php regex

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

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

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

修改 我想在这上面使用纯PHP。我想我知道如何使用js / jquery来做到这一点。

3 个答案:

答案 0 :(得分: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;

See it in action

答案 1 :(得分:4)

描述

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

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

enter image description here

摘要

  • (启动捕获组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的通常的肥皂盒免责声明。

答案 2 :(得分:1)

$string=preg_replace(
'@<a (.*)title="(.*)"([^>]*)>(.*)</a>@iU',
'<a $1title="'.$replacement.'"$3>$4</a>',
$string);

请注意,表达式末尾的i使其不区分大小写,U使其不合适。