这是我的第一个问题。我需要做的是我认为简单的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 :(得分: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_string
,br
和$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}}
希望相对容易理解。可能很难解释正则表达式模式正在做什么,所以如果这仍然很难理解,我很抱歉。如果您仍然感到困惑,可以在backreferences和lazy 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
);
我假设你要转换一些源代码?