Как правильно подставлять html-объекты?

у меня так:

$mytext="that's really "confusing" and <absolutly> silly";
echo substr($mytext,0,6);

Вывод в этом случае будет: that&# вместо that's

Я хочу, чтобы html-объекты считались 1 символом, а затем substr, потому что я всегда получаю сломанный html или какие-то непонятные символы в конце текста.

Пожалуйста, не предлагайте мне html-декодировать его, затем substr, а затем кодировать, мне нужен чистый метод :)

Спасибо


person Emily    schedule 17.04.2010    source источник
comment
Что нечистого в декодировании и последующем взятии подстроки? Вы бы предпочли использовать всевозможные причудливые регулярные выражения или какую-то логику поиска и замены? Я не уверен, какую магию вы ожидаете увидеть.   -  person zombat    schedule 17.04.2010
comment
Функции PHP существуют по какой-то причине, не изобретайте велосипед.   -  person Ben    schedule 17.04.2010


Ответы (6)


Есть два способа сделать это:

  1. Вы можете декодировать объекты HTML, substr() и затем кодировать; или же

  2. Вы можете использовать регулярное выражение.

(1) использует html_entity_decode() и htmlentities():

$s = html_entity_decode($mytext);
$sub = substr($s, 0, 6);
echo htmlentities($sub);

(2) может быть что-то вроде:

if (preg_match('!^([^&]|&(?:.*?;)){0,5}!s', $mytext, $match)) {
  echo $match[0];
}

Это говорит о следующем: найдите мне до 5 вхождений предыдущего выражения с начала строки. Предыдущее выражение:

  • любой символ, не являющийся амперсандом; или же

  • амперсанд, за которым следует что-либо до точки с запятой включительно (т. е. объект HTML).

Это не идеально, поэтому я бы предпочел (1).

person cletus    schedule 17.04.2010


function encoded_substr($string, $param, $param2){
  $s = html_entity_decode($string);
  $sub = substr($s, $param, $param2);
  return htmlentities($sub);
}

Там я скопировал код Клетуса в функцию для вас. Теперь вы можете вызвать очень простую трехстрочную функцию с помощью одной строки кода. Если это не «чистый», то я не понимаю, что означает «чистый».

person Syntax Error    schedule 17.04.2010

Имейте в виду, что некоторые символы нарушают предложенную декодировку + кодировку, если вы используете substr().

Пример

$string=html_entity_decode("Workin’ on my Fitness…In the Backyard.");

echo $string;
echo substr($string,0,25);
echo htmlentities(substr($string,0,25));

Выведет:

  • Работаю над фитнесом… На заднем дворе.
  • Работаю над фитнесом�
  • (пустая строка)

Решение

Используйте mb_substr().

echo mb_substr($string,0,25);
echo htmlentities(mb_substr($string,0,25));

Выведет:

  • Работаю над фитнесом… В
  • Работаю’ над своим Fitness…In
person Rasmus    schedule 19.05.2015
comment
Это путь! Спасибо. :) - person tommyskott; 22.01.2021

Попробуйте использовать следующие функции кодирования.

<?php

$mytext="that&#039;s really &quot;confusing&quot; and &lt;absolutly&gt; silly";

echo limit_text($tamil_var,6);

function limit_text($text,$limit){
   preg_match_all("/&(.*)\;/U", $text, $pat_array);
   $additional=0;

   foreach ($pat_array[0] as $key => $value) {
     if($key <$limit){$additional += (strlen($value)-1);}
   }
   $limit+=$additional;

   if(strlen($text)>$limit){
     $text = substr( $text,0,$limit );
     $text = substr( $text,0,-(strlen(strrchr($text,' '))) );
   }
   return $text;

}

?>
person iCLIENT Technoloogies    schedule 01.12.2012

Что ж, чистый метод только один: вообще не использовать сущности.
Нет ни одной причины подчеркивать строку. Его можно использовать только для вывода.
Итак, сначала substr, затем encode.

person Your Common Sense    schedule 17.04.2010

Вот исправление кода синтаксической ошибки, используйте mb_substr, чтобы избежать сюрпризов, таких как html-сущность с меньшим количеством символов или подсчет символов не работает должным образом, в моем случае Sábado становится Sá:

function encoded_substr($string, $param, $param2){
$s = html_entity_decode($string);
$sub = mb_substr($s, $param, $param2);
return htmlentities($sub);
}
person Stélio Inácio    schedule 07.03.2018