我在页面上有两组标签,首先是
{tip}tooltip text{/tip}
,第二个是
{tip class="someClass"}tooltip text{/tip}
我需要用
替换那些<span class=„sstooltip”><i>?</i><em>tooltip text</em></span>
我不知道如何处理向<span>
标记添加新类的问题。 (工具提示类始终存在)
这是我的正则表达式/\{tip.*?(?:class="([a-z]+)")?\}(.*?)\{\/tip\}/
。
我想我需要检查数组索引的类值,但这些是不同的,具体取决于{tip}标签版本。我是否需要两个正则表达式,每个版本一个,或者有一些方法来提取和替换类值?
php代码:
$regex = "/\{tip.*?(?:class=\"([a-z]+)\")?\}(.*?)\{\/tip\}/";
$matches = null;
preg_match_all($regex, $article->text, $matches);
if (is_array($matches)) {
foreach ($matches as $match) {
$article->text = preg_replace(
$regex,
"<span class=tooltip \$1"."><i>?</i><em>"."\$2"."</em></span>",
$article->text
);
}
}
答案 0 :(得分:1)
这是你的答案(我也让它更健壮):
onRefreshToken()
PCRE(PHP使用,如果内存服务)将自动获取第一个捕获组(获取类)在第一种情况下为空,并且只替换替换中的空字符串。第二种情况是不言自明的。
您的替换代码将如下所示:
{tip(?:\s+class\s*=\s*"([a-zA-Z\s]+)")?}([^{]*){\/tip}
你不需要事先检查正则表达式是否匹配 - $article->text = preg_replace(
'/{tip(?:\s+class\s*=\s*"([a-zA-Z\s]+)")?}([^}]*){\/tip}/',
'<span class="tooltip $1"><i>?</i><em>$2</em></span>',
$article->text
);
所隐含的,正在执行正则表达式匹配,然后替换任何匹配的文本通过该文本的模式。如果没有匹配,则不进行替换。