我需要preg_replace用标签<span class="text=arial"></span>包装整个HTML页面中所有拉丁字符和数字序列的模式。例如,下面的HTML部件
<a href="http://domain.com/path" target="_blank">GSPd 役に立つツール: スキル意欲マトリクス</a>应改为:
<a href="http://domain.com/path" target="_blank"><span class="text=arial">GSPd</span> 役に立つツール: スキル意欲マトリクス</a>显然,只有内部节点文本才应该以这种方式处理,这样替换就不会破坏HTML标记。
我试过的是:
$p = '#(?<=\>)([a-zA-Z0-9]+)(?=\<)#ium';
$html = preg_replace(
$p,
'><span class="text-arial">$0</span><',
$html
);应该扩展此模式以包括内容由混合字符组成的情况,例如GSPd 役に立つツール: スキル意欲マトリクス 100
发布于 2014-06-09 10:47:51
要在跳过<tag>中的文本时匹配字母和数字,您可以使用可爱的(*SKIP)(*F)技术(在Perl和PCRE中可用),这样做不需要费力:
(?i)<[^>]*>(*SKIP)(*F)|[a-z][a-z ]+在演示上,查看替换部分。
你可以把它弹到你的preg_replace中:
$regex = "~(?i)<[^>]*>(*SKIP)(*F)|[a-z][a-z ]+~";
$replace = '<span class="text=arial">\0</span>';
$replaced = preg_replace($regex,$replace,$original);它是如何工作的?
在这种情况下,您希望将某些内容排除在之外--在本例中,是标记。它类似于关于正则表达式-匹配模式,除非.“的这个问题
替换|的左侧匹配完整的< ... >标记,然后故意失败,引擎跳到字符串中的下一个位置。右侧与“拉丁文”(在这里我将其定义为字母和空格,可以细化)相匹配,我们知道它是正确的文本,因为左边的表达式没有匹配它。
进一步改进
您可以探索和完善[a-z][a-z ]+,直到您满意它符合您对“拉丁文”的定义。
参考
发布于 2014-06-10 09:26:52
我对or 81的方法做了一些调整,以避免处理某些标记的文本,比如样式或脚本:
$regex = "~(?i)<(head|style|script|noscript)[^>]*?>.*?<\/.*?\\1>(*SKIP)(*F)|<[^>]*>(*SKIP)(*F)|[a-z0-9&][_a-z0-9&,.;:#%\-/\(\) ]*~smu";
$replace = '<span class="text-arial">\0</span>';
$html = preg_replace($regex,$replace,$html);需要什么?
客户要求使用MS哥特式作为日文字符,阿里尔用于拉丁字符。问题是,MS哥特式字体已经有了拉丁文的字体,并且要将Arial应用于拉丁文字符,它们应该加上一些标签,以便能够通过CSS应用font-family: Arial。手动添加spans是很烦人的,所以非常感谢@ is 81为一个好的解决方案!
https://stackoverflow.com/questions/24118049
复制相似问题