【发布时间】:2016-11-18 06:31:30
【问题描述】:
我有用户可以插入到所见即所得编辑器(包含 HTML 代码)中的占位符。有时,当他们从 Word 等应用程序粘贴时,它会在其中注入 HTML。
例如:它粘贴 %<span>firstname</span>% 而不是 %firstname%。
这是我的正则表达式代码示例:
$html = '
<p>%firstname%</p>
<p>%<span>firstname</span>%</p>
<p>%<span class="blah">firstname</span>%</p>
<p>%<span><span>firstname</span></span>%</p>
<p>%<span><span><span>firstname</span></span></span>%</p>
<p>%<span class="blah"><span>firstname</span></span>%</p>
<div>other random <strong>HTML</strong> that needs to be preserved.</div>
';
preg_match_all(
'/\%(?![0-9])((?:<[^<]+?>)?[a-zA-z0-9_-]+(?:[\s]?<[^<]+?>)?)\%/U',
$html,
$matches
);
echo '<pre>';
print_r($matches);
echo '</pre>';
输出如下:
Array
(
[0] => Array
(
[0] => %firstname%
[1] => %firstname%
[2] => %firstname%
)
[1] => Array
(
[0] => firstname
[1] => firstname
[2] => firstname
)
)
只要占位符中有多个跨度,它就不起作用。我不太确定要在我的正则表达式中调整什么。
/\%(?![0-9])((?:<[^<]+?>)?[a-zA-z0-9_-]+(?:[\s]?<[^<]+?>)?)\%/U
我将如何实现这一目标?
【问题讨论】:
-
@WiktorStribiżew 我的问题是我需要使用正则表达式获取字符串。
-
使用正则表达式,您只能匹配平衡数量的标签,但您必须循环匹配并进一步处理它们或使用
preg_replace_callback和this 并使用strip_tags在匿名函数内部。问题是您无法访问从子例程调用中捕获的子字符串。这就是为什么这种类型的任务不应该真的用正则表达式来完成(一般来说,它相当麻烦)。