2011-04-21 122 views
1

这是我的第一个问题在这里。我需要做我认为是一个简单的php 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>

[编辑为包括实际数据]

+0

请给出一个真正的示例字符串和预期输出。 – mario 2011-04-21 22:20:17

+0

@mario真实信息添加 – morgar 2011-04-21 22:37:01

回答

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 
); 

我假设你把一些源代码?

+0

是的,我正在将一些旧代码转换为新的更简单的格式。我现在添加了一个示例输入和输出。 – morgar 2011-04-21 22:51:11

+0

在这个例子中它应该工作。 – mario 2011-04-21 22:53:53

+0

它的工作原理!不知道为什么,我应该学习一点正则表达式:)我正在转换一些需要显示文本内部棋子的国际象棋课程。在旧的方式中,该功能插入了具有所有细节的标签。用一些CSS可以做得更容易。非常感谢您的帮助 – morgar 2011-04-21 23:06:20

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); 

然而,这只是我在我读你的问题的方式最好的猜测。为了真正解决这个问题,我们需要更多地了解,post_stringbr应该代表什么,以及它们可能如何变化。一些示例输入和输出文本可能会有所帮助,可能会提供一些有关您使用此功能的信息。

编辑:我认为你最近的编辑更清楚一点。它看起来像你试图用正则表达式来解析JavaScript或其他编程语言,由于limitations of regex,你通常不能完美地完成。但是,以下在大多数情况下工作:

$pattern = '/(["\'])\s*\+\s*\w+\((["\'])(.*?)\2\)\s*\+\s*\1/' 
$output = preg_replace($pattern, '<span class="$3"></span>', $input); 

说明:

/ 
(["\']) #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. 
/

希望这是比较容易理解的。可能很难解释什么正则表达式模式正在做,所以我很抱歉,如果这仍然是困难的。如果您仍然感到困惑,请参阅backreferenceslazy quantifiers的更多信息。

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

+0

我编辑了包含更详细信息的问题。感谢您的回答。 – morgar 2011-04-21 22:36:12

+0

我添加了一个示例输入和输出。不知道你在哪里搜索(如果你这样做)在正则表达式中的“figure()” – morgar 2011-04-21 22:53:54

+0

@morgar - 我知道缺少一些东西。对不起,现在检查它。 – 2011-04-21 23:02:06