【问题标题】:Getting anchor name with php regex使用 php 正则表达式获取锚点名称
【发布时间】:2010-11-15 11:35:16
【问题描述】:

我需要使用正则表达式和 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' );
    }

【问题讨论】:

标签: php regex


【解决方案1】:

DOMXPath 与 DOMDocument 或 SimpleXML 一起使用。但永远不要使用正则表达式模式!

【讨论】:

  • 使用模式 IF AND ONLY IF 你自己生成了标记语言是非常好的,因为你可以 100% 保证它符合特定的子集标记语言。在一般情况下,这太难了,但在许多特定情况下,它是完全可以接受的。
  • 问题是我没有得到一个 html 页面或 xml 文件,而只有一个内容块,它实际上是从 get_the_Content() wordpress 函数中得到的。标记是我的,我使用 wordpress 内容过滤器创建它,它始终采用 something 的形式。
  • @TwoDiv 没关系。您的问题下方相关链接中列出的任何工具都可以使用部分 HTML。有关工作示例,请参阅 closevote 问题。只需要用名称交换href。如果你确定它总是&lt;a name="something"&gt; 匹配#&lt;a name="(.*)"&gt;#。不过应该让它变得不贪心。
  • 感谢@stillstanding 并感谢@Gordon - 我已经设法让它工作了,我会更新我原来的帖子
【解决方案2】:
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?";
preg_match($regex, $yourstring, $result);

例如:

$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

【讨论】:

  • 我认为 OP 想要的是 A 元素的 name 属性的内容,而不是 URL 的片段。
【解决方案3】:

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

如果你的意思是 not 在行首,那有点不同。也许你可以使用后向否定。但需要更多信息。

如果你真的很执着并决心使用a regex to split HTML tags,那么你至少应该正确地使用它。

【讨论】:

  • 我的正则表达式很糟糕,所以我从 gskinner.com/RegExr 那里得到了解释。它应该获得 name 属性。它在正则表达式模拟器上运行良好,但在 php 上却不行,我理解这是因为 php 使用了稍微不同的正则表达式语法
  • @TwoDiv:是的,这是正则表达式的祸根:特定的语法在不同的应用程序中会以不同的方式工作或失败。尽管大多数人说它们是 Perl 派生的,但这并不能说明整个故事,也不能使它们相互兼容,正如我看到你发现的那样。希望 PHP 在这些日子里赶上 PCRE 8,这应该会有所帮助。
【解决方案4】:

仅适用于确切的&lt;a name="[variable]"&gt; 字符串(字符串,而不是元素。正则表达式对元素和属性一无所知。它们无法解析 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,因为主题已被打死

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多