我需要用正则表达式和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' );
}
答案 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因为主题已被打死