Если вы уверены, что у вас никогда не будет угловых скобок (<>
) внутри значений атрибутов или комментариев вашего 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<>]
, так что вы действительно соответствуете только буквенно-цифровым строкам (если это то, что вы хотите).