使用 PHP 将字符串分成两部分以生成新的 html 文档

Brake a string into two parts using PHP to generate a new html document

我在这里要做的是打开一个 php 文档并只显示部分文本,在 70 个单词(或 900 个字符)设置锚点后打开其余部分新 html(或 php)文档中的字符串内容...

这是我到目前为止能够收集到的内容。

    <?php
    $str = '<p>El sistema de reconocimiento facial ha sido instalado en los ba&ntilde;os p&uacute;blicos del Templo del Cielo en Pek&iacute;n para evitar el malgasto de&nbsp;papel&nbsp;higi&eacute;nico, que era tomado en cantidades ingentes por algunos turistas, inform&oacute; hoy el diario Beijing Evening News.</p>
    <p>En la instalaci&oacute;n del parque, uno de los m&aacute;s famosos de Pek&iacute;n, una m&aacute;quina escanea el rostro del usuario, le dispensa un trozo de&nbsp;papel&nbsp;higi&eacute;nico de 60 cent&iacute;metros de longitud y no le permite volver a usar m&aacute;s hasta que han pasado nueve minutos.</p>
    <p>"Creemos que es la &uacute;nica manera de evitar el despilfarro de&nbsp;papel&nbsp;higi&eacute;nico", explic&oacute; a la prensa local el dise&ntilde;ador del pol&eacute;mico aparato.</p>
    <p><img src="http://alfredoalvarez.mx/img/fotos/normal/01644814.jpg" /></p>
    <p>"Si alguien se encontrase realmente indispuesto puede solicitar ayuda a nuestro personal", a&ntilde;adi&oacute;.</p>
    <p><strong>&nbsp;GASTABAN 12 ROLLOS, AHORA S&Oacute;LO OCUPAN 4 AL D&Iacute;A...&nbsp;</strong></p>
    <p>&nbsp;La Oficina Municipal de Parques de Pek&iacute;n lanz&oacute; una campa&ntilde;a en la red social Weibo (el Twitter chino) a principios de marzo para concienciar a la gente, en especial a los turistas chinos, sobre un uso responsable de estas instalaciones p&uacute;blicas, ya que algunos usuarios se llevaban el&nbsp;papel.</p>
    <p><img src="http://alfredoalvarez.mx/img/fotos/normal/21644816.jpg" /></p>
    <p>Las primeras m&aacute;quinas se instalaron el pasado a&ntilde;o en varios aseos p&uacute;blicos del Parque Ol&iacute;mpico de la capital&nbsp;china, una zona que ya cuenta con un total de hasta veinte dispositivos y que, seg&uacute;n trabajadores del recinto, ha generado un ahorro de unos 2.100 yuanes mensuales (alrededor de 300 d&oacute;lares, 285 euros) por ba&ntilde;o.</p>
    <p>Por su parte, uno de los administradores del parque relat&oacute; c&oacute;mo, antes de instalar este sistema, en un ba&ntilde;o se gastaban una media de 14 rollos al d&iacute;a, "y ahora s&oacute;lo gastamos 4".</p>
    <p>La medida no ha estado exenta de pol&eacute;mica y ha enfadado a algunos ciudadanos chinos que la consideran "falta de responsabilidad social" para quienes puedan verse en situaciones de necesidad.&nbsp;</p><p>&nbsp;</p>
    <p>Tambien lee: <a href="articulo.php?art=295">Arrestan a turistas por tener sexo fuera del matrimonio</a></p>
    <p>&nbsp;</p>';


    if(empty($_GET['blq'])){
    $bl2='2';
    $bl1 = substr($str, 0, 900);
    $result1 = substr($bl1, 0, strrpos($bl1, ' '));
    echo $result1.' ... <a href="test.php?blq='. $bl1 .'">Continue.</a></p>';
    }elseif(isset($_GET['blq']) && $_GET['blq']=='2'){

    $bl2 = substr($str2, 880, 2000);
    $result2 = substr($bl2, 0, strrpos($bl2, '.')).'.';
    echo '<p>'.$result2.'</p>';
    }

    ?>

它可以工作,但如果字符串在一个标签的中间结束或开始,我会得到标签的剪切片段。

我试过使用这个例子:

    $arr = explode(" ", str_replace(",", ", ", $str));
    $str='';
    for ($index = 0; $index < 72; $index++) {
    echo  $str = $arr[$index]. " ";
    }

但想不出如何在下一页上提取字符串延续。

首先我们需要一个更明智的方法来解决这个问题,所有的行都包含在一个 <p> 元素中,我们不想在中间剪断,所以严格的长度无济于事.

这段漂亮的代码会将您的字符串转换为一个数组,其中每个 <p> 标签都有自己的索引。允许的元素是 '<img><strong><a>',所有其他元素都将被剥离,包括我们可以稍后添加的 <p> 元素。

$data = array_map(function($v){
    return strip_tags($v, '<img><strong><a>');
}, explode('</p>', $str));

print_r($data);

接下来你想按长度切割,你想要页面所以让我们创建一个小函数:

function page($array, $start = 0, $chars = 800){
  $start = $start * $chars; // start writing to array when amount of chars has been reached.
  $e = $start + $chars; // End the loop when this number has been achieved.

  $c = 0;
  foreach($array as $v){
    $c += strlen($v);

    if($c > $e){
      // stop the loop, the amount of chars for this page has been reached.
      break;
    }

    if($start < $c){
      //write data to new array
      $tmp[] = $v;
    }
  }

  return $tmp;
}

现在您只需执行以下操作即可:

$page = isset($p = $_GET['blq']) && is_numeric($p) ? $p : 1;

$pagetext = page($data, $page - 1);

if(!empty($pagetext)){
  foreach($pagetext as $v){
    echo "<p>$v</p>";
  }
} else {
  echo 'the text is out of bounds';
}

这将适用于以下索引。

http://yoursite.com/?blq=1
http://yoursite.com/?blq=2
http://yoursite.com/?blq=3
http://yoursite.com/?blq=4