Нужно регулярное выражение, чтобы добавить пробелы в длинные слова, но игнорировать теги и атрибуты HTML - PullRequest
4 голосов
/ 10 июля 2011

Мне нужно добавить пробелы в словах в описании продукта на предоставленной пользователем позиции (скажем, 25, например), чтобы обеспечить правильную упаковку. Я знаю, что CSS-трюки можно использовать, но это не то, что я ищу.

Пока что я могу сделать это, используя этот синтаксис, но проблема, с которой я сталкиваюсь, заключается в том, что он разбивает вещи, которые не должны быть разбиты, такие как URL-адреса в атрибутах тегов HTML.

    $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-тегов и атрибутов.

1 Ответ

6 голосов
/ 10 июля 2011

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

...