用php regex获取锚名称

时间:2010-11-15 11:35:16

标签: php regex

我需要用正则表达式和php捕获一个锚html标记的名称,所以从文本中我将得到“hello”(锚的名称)

试过:

$regex  = '/(?<=name\=")#([^]+?)#(?=")/i';  
preg_match_all($regex, $content, $data);
print_r($data);

我已经将apache错误日志保留了下来以找出:

  

PHP警告:preg_match_all():   编译失败:丢失   终止]为。的字符类   抵消26

也尝试过:

$regex  = '/(?<=name\=")([^]+?)(?=")/i'; 
$regex  = '/(?<=name\=")[^]+?(?=")/i'; 

基本相同。 我想我错过了一些东西,可能是一个愚蠢的斜线或类似的东西,但我不确定是什么

欢迎任何帮助 感谢

解决

好的,感谢@stillstanding和@Gordon我已经设法用DOMDocument做到了这很简单 所以,对于记录,这是片段

$dom = new DOMDocument;
    $dom->loadHTML($content);
    foreach( $dom->getElementsByTagName('a') as $node ) {
        echo $node->getAttribute( 'name' );
    }

4 个答案:

答案 0 :(得分:2)

使用DOMXPath以及DOMDocument或SimpleXML。但永远不要使用正则表达式模式!

答案 1 :(得分:0)

$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?";
preg_match($regex, $yourstring, $result);

e.g:

$yourstring="somelink.html#this";
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)";
preg_match($regex, $yourstring, $result);
echo substr($result[0],1);

会返回'test'

但是,parse_rul函数可能是从地址获取此信息的更好选择:

http://www.php.net/manual/en/function.preg-match.php#96339

如果您希望替换文档中的实际锚标记,请参阅here

答案 2 :(得分:0)

您的[^]+?是语法错误。应该是什么?一个或多个实例的最小匹配,更喜欢什么东西?如果您的意思是无字段^,那么您应该将其称为\^。但是,如果您指的是任何不是^的字符,您可以使用[^^],如果您觉得更清楚,可以写[^\^]

如果你的意思是在行的开头,那就有点不同了。也许你可以使用一个外观否定。但是需要更多信息。

如果你真的受约束并决定使用a regex to split HTML tags,那么你至少应该这样做。

答案 3 :(得分:0)

仅适用于精确的<a name="[variable]">字符串(字符串,而不是元素。正则表达式不了解元素,也不知道属性。它们无法解析HTML)。有关其他方法,请参阅问题下方的链接。

$text = '
    <a name="anything">something</a> blabla
    <span name="something">something</span>  blabla
    <a name="something else">something else</a>  blabla
';

preg_match_all('#<a name="(.*)">#', $text, $matches);
print_r($matches);

给出

Array
(
    [0] => Array
        (
            [0] => <a name="anything">
            [1] => <a name="something else">
        )

    [1] => Array
        (
            [0] => anything
            [1] => something else
        )
)

标记此CW因为主题已被打死