首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用span标记将拉丁字符序列包装起来

用span标记将拉丁字符序列包装起来
EN

Stack Overflow用户
提问于 2014-06-09 10:13:04
回答 2查看 117关注 0票数 1

我需要preg_replace用标签<span class="text=arial"></span>包装整个HTML页面中所有拉丁字符和数字序列的模式。例如,下面的HTML部件

代码语言:javascript
复制
<a href="http://domain.com/path" target="_blank">GSPd 役に立つツール: スキル意欲マトリクス</a>

应改为:

代码语言:javascript
复制
<a href="http://domain.com/path" target="_blank"><span class="text=arial">GSPd</span> 役に立つツール: スキル意欲マトリクス</a>

显然,只有内部节点文本才应该以这种方式处理,这样替换就不会破坏HTML标记。

我试过的是:

代码语言:javascript
复制
$p = '#(?<=\>)([a-zA-Z0-9]+)(?=\<)#ium';
$html = preg_replace(
    $p,
    '><span class="text-arial">$0</span><',
    $html
);

应该扩展此模式以包括内容由混合字符组成的情况,例如GSPd 役に立つツール: スキル意欲マトリクス 100

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-09 10:47:51

要在跳过<tag>中的文本时匹配字母和数字,您可以使用可爱的(*SKIP)(*F)技术(在Perl和PCRE中可用),这样做不需要费力:

代码语言:javascript
复制
(?i)<[^>]*>(*SKIP)(*F)|[a-z][a-z ]+

演示上,查看替换部分。

你可以把它弹到你的preg_replace中:

代码语言:javascript
复制
$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 ]+,直到您满意它符合您对“拉丁文”的定义。

参考

票数 2
EN

Stack Overflow用户

发布于 2014-06-10 09:26:52

我对or 81的方法做了一些调整,以避免处理某些标记的文本,比如样式或脚本:

代码语言:javascript
复制
    $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为一个好的解决方案!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24118049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档