我有一个由HTML代码组成的PHP字符串,如下所示:
$string =
'<ul>
<li>
<a href="/nalcrom">Nalcrom</a>
(Sodium Cromoglicate)
</li>
<li>
<a href="/alimemazine">Alimemazine</a>
</li>
<li>
<a href="/xolair">Xolair</a>
(Omalizumab)
</li>
</ul>';
使用
preg_match_all($regex,$string,$matches, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($matches[0]); ++$i)
{ echo $i . " " . $matches[0][$i]. "<br>"; }
如果我使用
$regex = "^(?<=>).*?(?=(\Q</a>\E))^";
我得到了
1 Nalcrom
2 Alimemazine
3 Xolair
而如果我使用
$regex = "^\(.*?\)^";
我得到了
1(色甘酸钠)
2(Omalizumab)
尝试
$regex = "^(?<=>).*?(?=(\Q</a>\E))(\(.*?\))^";
及其变化我只得到空白,而我需要的是:
1 Nalcrom(色甘酸钠)
2 Alimemazine
3 Xolair(Omalizumab)
关于我如何做到这一点的任何想法?日Thnx
答案 0 :(得分:0)
使第二个正则表达式组可选?
,即:
$string =
'<ul>
<li>
<a href="/nalcrom">Nalcrom</a>
(Sodium Cromoglicate)
</li>
<li>
<a href="/alimemazine">Alimemazine</a>
</li>
<li>
<a href="/xolair">Xolair</a>
(Omalizumab)
</li>
</ul>';
preg_match_all('%">(.*?)</a>\s+(\(.*?\))?%i', $string, $match, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($match[0]); $i++) {
echo $match[1][$i] . " ". $match[2][$i];
}
输出:
Nalcrom (Sodium Cromoglicate)
Alimemazine
Xolair (Omalizumab)
答案 1 :(得分:0)
这是一个非正则表达式解决方案。这将删除所有HTML,然后使用新行作为数据点的指示符。如果新行以(
开头,则假定它属于前一个点并将其附加到那里。
<?php
$string =
'<ul>
<li>
<a href="/nalcrom">Nalcrom</a>
(Sodium Cromoglicate)
</li>
<li>
<a href="/alimemazine">Alimemazine</a>
</li>
<li>
<a href="/xolair">Xolair</a>
(Omalizumab)
</li>
</ul>';
$new_string = strip_tags($string);
$newlines = explode("\n", $new_string);
$count = 0;
$output = '';
foreach($newlines as $newline) {
$newline = trim($newline);
if(!empty($newline)) {
if(preg_match('~^\(~', $newline)) {
$output .= $newline;
} else {
$count++;
if(!empty($output)) {
$output .= "\n\n";
}
$output .= $count . ' ' .$newline . ' ';
}
}
}
echo $output;
然后输出是:
1 Nalcrom(色甘酸钠)
2 Alimemazine
3 Xolair(Omalizumab)
答案 2 :(得分:0)
尝试以下正则表达式:
@>([^<]+)</a>([^<]*)</li>@ius
在您的示例中,$ matches [1] [0]和trim($ matches [2] [0])应分别返回Nalcrom和Sodium Cromoglicate。因此,您可以使用第二个索引迭代列表。
我的示例需要修剪以保持正则表达式简单,但实际上你可以扭曲它以便它不会捕获空白字符。