需要正则表达式的字符串来将记录preg_split到数组中


need a string for regular expression to preg_split records into array

$source="<p><b>Lal, Vaninm</b></p>
<p><b>Vice President &amp;</b></p>
<p><b>General Manager</b></p>
<p>Company 1 Inc.</p>
<p>PO Box 123456</p>
<p>salt Lake1, 00111-3333</p>
<p>111-111-111 / F: 111-111-111</p>
<p>info1@site1.com</p>
<p><b>Andrus, Reed </b></p>
<p><b>Manager</b></p>
<p>Company 2 Inc.</p>
<p>Monada, Suite 222</p>
<p>J , Lousiana 2222</p>
<p>222-222-222 / F: 222-222-222</p>
<p>info2@site2.com</p>
<p><b>Sharma, John L.</b></p>
<p><b>Senior Property Manager</b></p>
<p>Company 3  Ltd.</p>
<p>PO Box 3333</p>
<p>Grand Cinema, Layman Islands</p>
<p>FGB 333</p>
<p>333-333-333</p>
<p>info3@site3.com</p>
<p><b>Lucky, Philip S</b></p>
<p>Life Member</p>
<p>Company 4 Inc.</p>
<p>Battelsville, Oklahoma 74000</p>
<p>444-444-444</p>
<p><b>Berry, Richard B, RPA, CPM</b></p>";
$records = preg_split ("@'<p'>'<b'>(.*?)('<p'>(.*)'</p'>'<p'>'<b'>)@s", $source); 
var_dump($records);

数组必须包含4条记录。标签中包含的数据是无意义的。我对正则表达式不熟悉。我如上所述尝试过。请建议使用正则表达式。提前谢谢。

我认为<p><b> ....<p>...</p><p><b>标识了一条记录。

关于使用regex解析html的所有免责声明,下面的regex将正确分割您的输入。

版本1:只包含换行符的文件(unix, osx)

(?=(?<=^|((?<!</b>)</p>'n))<p><b>)

版本2:带有回车和换行符的文件(windows)

(?=(?<=^|((?<!</b>)</p>'r'n))<p><b>)
因此,如果你使用第一个,你可以这样写:
$records = preg_split('~(?=(?<=^|((?<!</b>)</p>'n))<p><b>)~', $str);

注意,由于最后一行,实际上有五条记录:

<p><b>Berry, Richard B, RPA, CPM</b></p>";

它是如何工作的?

向前看,向后看。这是一个"零宽度"匹配,只寻找一个特定的位置。

  • (?=向前看断言<p><b>后面的当前位置…
  • 只要<p><b>前面有(在(?<=后面)字符串^</p>'n的开头,前面没有</b>(在(?<!</b>)后面)

享受吧!