用字母数字拆分字符串,用preg_Split拆分句号


Split a string with letters numbers and fullstops with preg_split

我正在尝试使用以下代码使用类似R401.4R402.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毫米),排水沟或应建造洼地,以确保排水远离结构距离建筑物基础应倾斜至少2%建筑。

[7] =>R401.4[8]=>土壤试验。

然而,当我在像regexer.com这样的正则表达式测试网站上尝试我的表达式时,它似乎工作正常。

http://regexr.com/3ds6l

我的regex有问题吗?或者这与php中的preg_match有关吗?

我正在寻找的是我的数组格式如下:

[3] =>R401.2要求。根据第R301节和将产生的载荷传递到支撑土壤。填土应设计、安装和根据公认的工程实践进行测试。砾石填充用作木制和预制混凝土基础的基脚应符合第R403节的规定。

[4] =>R401.3排水。地面排水应转移至雨水管道输送或其他经批准的收集点不会造成危险。地块应分级以排出地表水远离基础墙。坡度应至少下降6英寸(152毫米)。

注意:我知道使用DOM 解析页面通常更好

谢谢。

使用前瞻性断言解决了这个问题,如下所示: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);
?>

因为您没有捕获任何内容,所以不需要使用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不允许访问文本,所以我无法提供演示/输出。)