PHP&正则表达式提取字符串的两个独立部分作为ONE重组变量

时间:2015-04-25 14:27:25

标签: php regex

我有一个由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

3 个答案:

答案 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)

DEMO

答案 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。因此,您可以使用第二个索引迭代列表。

我的示例需要修剪以保持正则表达式简单,但实际上你可以扭曲它以便它不会捕获空白字符。