Разделите строку с буквами, цифрами и точками с помощью preg_split

Я пытаюсь разбить большую строку, используя разделитель, например R401.4 или R402.3.4, используя приведенный ниже код:

<?php
  $chapter = "http://codes.iccsafe.org/app/book/content/2015-I-Codes/2015%20IRC%20HTML/Chapter%204.html";

  $data = file_get_contents($chapter);

  $split = preg_split('/(<b>[R]\d{3}[.][0-9])/' , $data, -1, PREG_SPLIT_DELIM_CAPTURE);

  print_r($split);
?>

Когда я запускаю это в PHP, я получаю неправильное разделение, как показано ниже, где я получаю разделение там, где хочу, и после него, а не только в каждом разделе R401.:

[3] => R401.2 [4] => Требования. Конструкция фундамента должна быть способна воспринимать все нагрузки в соответствии с разделом R301 и передавать результирующие нагрузки на поддерживающий грунт. Насыпные грунты, поддерживающие фундаменты и фундаменты, должны быть спроектированы, установлены и испытаны в соответствии с принятой инженерной практикой. Гравийная засыпка, используемая в качестве оснований для деревянных и сборных железобетонных фундаментов, должна соответствовать Разделу R403.

[5] => R401.3 [6] => Дренаж. Поверхностные стоки должны быть отведены в ливневую канализацию или другое утвержденное место сбора, не создающее опасности. Участки должны быть выровнены для отвода поверхностных вод от стен фундамента. Уклон должен падать минимум на 6 дюймов (152 мм) в пределах первых 10 футов (3048 мм).

Исключение: там, где границы участка, стены, склоны или другие физические барьеры препятствуют падению с высоты 6 дюймов (152 мм) в пределах 10 футов (3048 мм), должны быть устроены водостоки или канавы для обеспечения стока от конструкции. Непроницаемые поверхности в пределах 10 футов (3048 мм) от фундамента здания должны иметь уклон не менее 2 процентов от здания.

[7] => R401.4 [8] => Испытания почвы.

Однако, когда я пробую свое выражение на веб-сайте тестирования регулярных выражений, таком как regexer.com, оно работает правильно.

http://regexr.com/3ds6l

Что-то не так с моим regex или это как-то связано с preg_match в php?

Я ищу, чтобы мой массив был отформатирован следующим образом:

[3] => Требования R401.2. Конструкция фундамента должна быть способна воспринимать все нагрузки в соответствии с разделом R301 и передавать результирующие нагрузки на поддерживающий грунт. Насыпные грунты, поддерживающие фундаменты и фундаменты, должны быть спроектированы, установлены и испытаны в соответствии с принятой инженерной практикой. Гравийная засыпка, используемая в качестве оснований для деревянных и сборных железобетонных фундаментов, должна соответствовать Разделу R403.

[4] => R401.3 Дренаж. Поверхностные стоки должны быть отведены в ливневую канализацию или другое утвержденное место сбора, не создающее опасности. Участки должны быть выровнены для отвода поверхностных вод от стен фундамента. Уклон должен падать минимум на 6 дюймов (152 мм) в пределах первых 10 футов (3048 мм).

Примечание. Я знаю, что обычно лучше анализировать страницы с помощью DOM

Спасибо.


person ian    schedule 23.07.2016    source источник
comment
Найдите PREG_SPLIT_DELIM_CAPTURE (и используйте DOM)   -  person Casimir et Hippolyte    schedule 23.07.2016


Ответы (2)


Решил это с помощью предварительных утверждений, как это сделано здесь: ">PHP preg_split с сохранением разделителя в начале элемента массива

<?php
  $chapter = "http://codes.iccsafe.org/app/book/content/2015-I-Codes/2015%20IRC%20HTML/Chapter%204.html";

  $data = file_get_contents($chapter);

  $split = preg_split('/(?=<b>[R]\d{3}[.][0-9])/' , $data, -1, PREG_SPLIT_DELIM_CAPTURE);

  print_r($split);
?>
person ian    schedule 23.07.2016

Поскольку вы ничего не записываете, вам не нужно использовать PREG_SPLIT_DELIM_CAPTURE.

Вот упрощенная версия:

$data=file_get_contents('http://codes.iccsafe.org/app/book/content/2015-I-Codes/2015%20IRC%20HTML/Chapter%204.html');
$split=preg_split('/(?=<b>R\d{3}\.\d)/',$data);
var_export($split);

(Предоставленный вами URL-адрес не позволял получить доступ к тексту, поэтому я не смог предоставить демонстрацию/вывод.)

person mickmackusa    schedule 31.08.2017