разбить строку на массив и обрезать середину? - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть строка, которая выглядит примерно так:

$str="

<code>

  lol
      test

</code>

test";

Я хочу обрезать текст, который находится внутри тегов, чтобы я получил следующее:

$str="

<code>lol
      test</code>

test";

Есть ли способ, которым я могу разделить это на 3 части массива и так просто обрезать () по тексту в середине?

большое спасибо

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

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

<?php
$string = "

<code>

  lol
      test

</code>

test";

$pattern = '/(<([a-z]+)>)\s*(.+)\s*(<\/\2>)/ms';

$new_string = preg_replace_callback($pattern, function ($m) {
    return $m[1].trim($m[3]).$m[4];
  }, $string);


var_dump($new_string);

Результат:

$ php test.php
string(35) "

<code>lol
      test</code>

test"

Обратите внимание, что шаблон html-тега здесь упрощен для вашего примера, и вам придется изменить его, если вам нужноподдерживать такие вещи, как, скажем, <coDe style="color: red;">

1 голос
/ 05 февраля 2012

Это должно сделать это. То, что он делает, ищет <tag>, за которым следует любое количество пробелов и пробелов, пока он не найдет другой непробельный символ. Затем он удаляет любое количество пробелов перед закрытием </tag>.

preg_replace(array(
    '/(<[a-zA-Z]+>)[[:space:]]*([^[:space:]])/m',
    '/[[:space:]]*(<\/[a-zA-Z]+>)/m',
), array(
    '\1\2',
    '\1',
), $str);

Посмотри в действии: http://codepad.org/Stmd32QL

Редактировать

Это будет искать только <code> теги.

preg_replace(array(
    '/(<code>)[[:space:]]*([^[:space:]])/mi',
    '/[[:space:]]*(<\/code>)/mi',
), array(
    '\1\2',
    '\1',
), $str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...