我需要在用户提供的位置(例如我们会说25)中在产品描述中的单词中添加空格以允许正确的包装。我知道可以使用CSS技巧,但这不是我所喜欢的。
到目前为止,我可以使用这种语法来做到这一点,但我遇到的问题是它的分裂内容不应该像HTML标记属性中的URL那样分裂。
$string = 'longwordlongwordlongword <a href="http://www.somelongdomainname.com/and-a-long-sub-directoty_name" class="some_long_class_name_here">someanchortext and title here</a>';
$spacer = 20;
$newtext = preg_replace('/([^\s]{' . $spacer . '})(?=[^\s])/m', '$1 ', $newtext);
结果就是这个......
longwordlongwordlong word <a href="http://www.som elongdomainname.com/ and-a-long-sub-direc toty_name" class="some_long_cla ss_name_here">somean chortext and title here</a>
我需要以某种方式告诉正则表达式除了HTML标记和属性之外的所有内容。
答案 0 :(得分:6)
如果您确定在HTML文件的属性值或注释中不会使用尖括号(<>
),那么您可以尝试这样做:
$result = preg_replace(
'/( # Match and capture...
[^\s<>] # anything except whitespace and angle brackets
{20} # 20 times.
) # End of capturing group.
(?! # Assert that it\'s impossible to match the following:
[^<>]* # any number of characters except angle brackets
> # followed by a closing bracket.
) # End of lookahead assertion.
/x',
'\1 ', $subject);
这里的想法是仅当文本中的下一个尖括号不是右括号时才匹配20个字符的非空格字符串(这意味着该字符串在标记内)。如果尖括号可能出现在其他地方,显然这会中断。
您可能还想使用\w
代替[^\s<>]
,因此您实际上只匹配字母数字字符串(如果这是您想要的)。