简单的php preg_replace

时间:2011-04-21 22:14:07

标签: php regex preg-replace

这是我的第一个问题。我需要做的是我认为简单的PHP preg_replace()替换,但我不了解正则表达式。

我有一个html格式的文本字符串,被几个" + figure("br") + "打破(包括开头和结尾引号)。我需要将它们更改为<em class="br"></em>,其中'br'是我必须保留的参数。

我有大约200多个要替换的文本。当然我可以单独替换前置和后置,但希望以正确的方式进行。 提前谢谢并原谅我的英语。

示例输入: <p>Bien!</p> <p>Gana <b>Material</b> por el <b>Doble Ataque</b> al " + figure("bn") + "c6 y a la " + figure("br") + "h8.</p>

示例输出:<p>Bien!</p><p>Gana <b>Material</b> por el <b>Doble Ataque</b> al <em class="bn"></em>c6 y a la <em class="br"></em>h8.</p>

[编辑包含真实数据]

2 个答案:

答案 0 :(得分:2)

我认为我们需要更多关于您的方案的信息,以便为您提供有用的信息。做你所描述的最简单的方法是做类似的事情:

$output = preg_replace('/.*\("br"\).*/', '<span class="br"></span>', $input);

但我不知道这是不是你真正想要的。这将删除初始字符串中的所有文本,并将其替换为<span class="br"></span>块,因此您剩下的就是重复字符串<span class="br"></span>

听起来我想要的是将foo("bar")baz看起来像foo<span class="bar"></span>baz的块更改为像$output = preg_replace('/\("(.*?)"\).*/', '<span class="$1"></span>', $input); 这样的块。如果是这种情况,你可能会想要这样的东西:

pre_string

然而,这只是我对你阅读问题的方式的最佳猜测。要真正解决问题,我们需要更多地了解post_stringbr$pattern = '/(["\'])\s*\+\s*\w+\((["\'])(.*?)\2\)\s*\+\s*\1/' $output = preg_replace($pattern, '<span class="$3"></span>', $input); 应该代表什么,以及它们如何变化。一些示例输入和输出文本可能会有所帮助,就像您正在使用它的一些信息一样。

编辑:我认为您的最新修改会让它更加清晰。看起来你正试图用正则表达式解析JavaScript或其他一些编程语言,由于limitations of regex,你通常无法做到这一点。但是,以下情况应该适用于大多数情况:

/
(["\'])    #Either " or '. This is captured in backreference 1 so that it can be matched later.
  \s*\+\s* #A literal + symbol surrounded by any amount of whitespace. 
  \w+      #At least one word character (alphanumeric or _). This is "figure" in your example.
  \(       #A literal ( character.
   (["\']) #Either " or '. This is captured in backreference 2.
     (.*?) #Any number of characters, but the `?` makes it lazy so it won't match all the way to the last `") + "` in the document.
   \2      #Backreference 2. This matches the " or ' from earlier. I didn't use ["\'] again because I didn't want something like 'blah" to match.
  \)       #A literal ) character.
  \s*\+\s* #A literal + symbol surrounded by any amount of whitespace.
\1         #Backreference 1, to match the first " or ' quote in the string.
/

说明:

{{1}}

希望相对容易理解。可能很难解释正则表达式模式正在做什么,所以如果这仍然很难理解,我很抱歉。如果您仍然感到困惑,可以在backreferenceslazy quantifiers上获取更多信息。

我不确定反向引用语法;这些天我通常不用PHP编写代码。如果有人想纠正我,我会欢迎它。

答案 1 :(得分:1)

如果你有一个变量前置和后置字符串(或者一个带有元字符的字符串),那么我认为最好使用一些正则表达式转义:

//  " + figure("br") + "
$pre = '" + figure';
$post = ' + "';

// escape
$pre = preg_quote($pre, "#");
$post = preg_quote($post, "#");

// then the regex becomes easy
$string = preg_replace(
               "#$pre\(\"(\w+)\"\)$post#",
               '<em class="$1"></em>',
               $string
);

我假设你要转换一些源代码?