Разрыв одной строки текста без каких-либо заметных точек разрыва в php [часть 2] - PullRequest
0 голосов
/ 13 июля 2011

Я получил три действительно полезных ответа здесь:

Разбить одну строку текста без каких-либо заметных точек разрыва в PHP

Похоже, добавив true какопция wordwrap исправила проблему, но она так сильно нарушает другую функцию, что я не могу ее использовать.Эта функция работает в том же ключе, что и эта проблема, и захватывает длинные URL-адреса и усекает текст привязки до «Короткого URL-адреса».

Есть идеи, почему добавление wordwrap true нарушает это?Я вижу любые символы после установленного предела URL-адреса, напечатанного после «Короткого URL-адреса», что довольно странно.

function long_links($stringa){

$m = preg_match_all('/(www\.|http:\/\/|https:\/\/)([^\s]+)/', $stringa, $match);

 if ($m){ $links=$match[0]; 

      for ($j=0;$j<$m;$j++){

       $loco=$links[$j]; $len=strlen($loco);

         if($len > 59){

        $stringa = str_replace($loco,'<a href="'.$loco.'" title="'.$loco.'" target=_blank><i>Short Link</i></a>',$stringa); 
   } 
  } 
  return $stringa;
 }

Зачем этот разрыв $body = wordwrap($body, 83, "\n", true); echo $body;?

Пример разливаЯ вижу:

*Short URL* conditions/products-and-services/bonus-bank/index.htm

РЕДАКТИРОВАТЬ после вопроса Мартина

$body=long_links($body); $body = wordwrap($body, 83, "\n", true); echo $body;

Еще раз спасибо!

1 Ответ

0 голосов
/ 13 июля 2011

Прежде всего, загляните на страницу руководства wordwrap . Там, в разделе Пользовательские заметки , вы можете найти код для функции переноса слов, которая извлекает все теги html, оборачивает остальные слова и помещает теги html обратно.

Затем, чтобы ответить на ваш вопрос, попробуйте немного отладить и поделитесь результатами, отредактировав свой вопрос. Что попробовать:

Приведенный пример должен выглядеть следующим образом:

<a href="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   title="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   target=_blank><i>Short Link</i></font></a> 

но выглядит так, верно?

<a href="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products" 
   title="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products" 
   target=_blank><i>Short Link</i></font></a> 
-and-services/bonus-bank/index.htm

Итак, сначала посмотрим, что делает с этим wordwrap:

$teststring = '<a href="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   title="http://www.vodafone.co.uk/vodafone-uk/about-this-site/terms-and-conditions/products-and-services/bonus-bank/index.htm" 
   target=_blank><i>Short Link</i></font></a>';
echo wordwrap($teststring, 83, "\n", true);

Если вы сделали это, вставьте HTML-код результата, как он есть, в ваш вопрос.


Попробуйте эту функцию (из справочная страница php для wordwrap ):

здесь был код, но он не был хорошего качества

Я не проверял, но если он работает, вам повезло, верно?


Теперь вы заставили меня немного попробовать, и вот мой результат:

function get_tags_array($str)
{
    //given a string, return a sequential array with html tags in their own elements
    $q = '?';
    return preg_split("/(<.*$q>)/",$str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
}

function html_combi_wordwrap($str, $width = 75, $break = "\n", $cut = false)
{
    $tag_arr = get_tags_array($str);
    foreach($tag_arr as $key => $tag_str)
    {
        if(preg_match("/<.*>/", $tag_str))
            continue;

        $tag_arr[$key] = wordwrap($tag_str, $width, $break, $cut);
    }
    return implode($tag_arr);
}

Это объединяет идею этого кода (то есть, только обтекание текста без тегов html) с обычной функцией переноса слов, которая все еще может быть заменена вариантом utf-8 или чем-то еще ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...