在删除换行符和引号时使用正则表达式替换文本

时间:2012-10-04 13:52:40

标签: php regex preg-replace pcre

现在这主要是学术性的,因为我可以通过其他方式获得相同的结果,但是...它一直在困扰我,我确信它可能以某种方式使用正则表达式。

我想使用PHP的preg_replace来替换内容:

Content: “String <tag>This is some content, which contains newlines and quotation marks.</tag> and other unrelated content”.

Regex: /<tag>(.*)<\/tag>/sU

Replace: “String of other content, including matched pattern $1”

但问题是,我想删除元素之间的任何换行符和/或引号。什么正则表达式允许我这样做?

3 个答案:

答案 0 :(得分:1)

PHPs preg_replace()对主题进行一次处理。您实际上可以指定模式和替换的数组,但是只有一个将匹配主题字符串的每个部分。肯定没有使用singel正则表达式的解决方案,因为这个问题不在常规语言中。理论计算机科学教导你需要一个有状态的自动机来完成这样的任务。正则表达式是原始的。

答案 1 :(得分:0)

正如arkascha指出的那样,这不是一个容易在一次通过中完成的问题。

可以在Perl中一步完成:

use strict;
use warnings;
my $string = "blah <tag> foo \"bar \n </tag> baz";

$string =~ s/(?<=\<tag\>)([^<]+)(?=\<\/tag\>)/$_=$1;s|[\n\"]||gs;$_/ges;

print $string;

这利用了Perl允许您使用代码生成替换字符串的事实。

我不知道在PHP中是否可以做类似的事情。无论如何,这不是一个好的真实代码设计。但它很有趣。

答案 2 :(得分:0)

不容易,但可能。

试试这个 PHP代码

function myFn($a, $b, $c) {
  $b = preg_replace("!(?:\\\'|[\"\n\r])!", '', $b);
  return "BEGIN " . $b . " END";
}
$s = "abc <tag>def \n ghi 'jkl' mno \"pqr\" stu</tag> vwx";
$s = preg_replace('!(<tag>)(.*?)(</tag>)!ise', 'myFn("$1", "$2", "$3")', $s);
print $s;

输出:

abc BEGIN def  ghi jkl mno pqr stu END vwx

测试此代码here