用于Anchor标签的PHP RegEx(或Alt方法)

时间:2009-09-09 13:45:13

标签: php regex

好的我必须解析SOAP请求,并且在请求中,一些值与Anchor标记一起传递(或在其内部)。寻找一个RegEx(或alt方法)去除标记并返回值。

// But item needs to be a RegEx of some sort, it's a field right now
if($sObject->list == 'item') {
   // Split on > this should be the end of the right side of the anchor tag
   $pieces = explode(">", $sObject->fields->$field);

   // Split on < this should be the closing anchor tag
   $piece = explode("<", $pieces[1]);

   $fields_string .= $piece[0] . "\n";
}

item是一个字段名称,但我想将其作为RegEx来检查Anchor标记而不是特定字段。

5 个答案:

答案 0 :(得分:3)

PHP具有strip_tags()功能。

或者,您可以将filter_var()FILTER_SANITIZE_STRING一起使用。

无论你做什么,都不会用正则表达式解析HTML / XML。它真的很容易出错并且很脆弱。 PHP标准至少有3种不同的解析器(SimpleXMLDOMDocumentXMLReader。{/ p>

答案 1 :(得分:1)

我同意cletus,在HTML上使用RegEx是不好的做法,因为HTML作为一种语言有多松散(我抱怨PHP过于宽松......)。除非您知道文档符合标准/严格,否则您可以通过多种方式对变量进行变换,有时这样做是不可能的。但是,因为我喜欢让我分心的工作,所以你可以在RegEx中做到这一点!

我会把它分成几个部分,如果你看到的只是一个字符串并说“Meh ......它会......”,这一点毫无意义!首先,我们有一个锚标记的主要RegEx:

'#<a></a>#'

然后我们添加可能在标签之间的文本。 我们想把它组成括号,所以我们可以提取字符串,问号使得asterix通配符“不贪婪”,这意味着它所遇到的第一个</a>将是它用来结束的那个RegEx。

'#<a>(.*?)</a>#'

接下来,我们在RegEx中添加href =“”。我们将href="匹配为纯文本,然后匹配不包含引号的任意长度的字符串,然后是结束引号。

'#<a href\="([^"]*)">(.*?)</a>#'

现在我们只需要说标签允许其他属性。根据规范,属性可以包含以下字符:[a-zA-Z_\:][a-zA-Z0-9_\:\.-]*。 多次允许属性,并使用值,我们得到:( [a-zA-Z_\:][a-zA-Z0-9_\:\.-]*\="[^"]*")*

结果RegEx(PCRE)如下:

'#<a( [a-zA-Z_\:][a-zA-Z0-9_\:\.-]*\="[^"]*")* href\="([^"]*)"( [a-zA-Z_\:][a-zA-Z0-9_\:\.-]*\="[^"]*")*>(.*?)</a>#'

现在,在PHP中,使用preg_match_all()函数来获取字符串中的所有出现。

$regex = '#<a( [a-zA-Z_\:][a-zA-Z0-9_\:\.-]*\="[^"]*")* href\="([^"]*)"( [a-zA-Z_\:][a-zA-Z0-9_\:\.-]*\="[^"]*")*>(.*?)</a>#';
preg_match_all($regex, $str_containing_anchors, $result);
foreach($result as $link)
 {
  $href = $link[2];
  $text = $link[4];
 }

答案 2 :(得分:0)

使用simplexml和xpath来检索所需的节点

答案 3 :(得分:0)

如果您只想从特定代码中删除或提取属性,请尝试DOMDocument

这样的事情:


$TagWhiteList = array(
    // Example of WhiteList
    'b', 'i', 'u', 'strong', 'em', 'a', 'img'
);

function getTextFromNode($Node, $Text = "") {
    // No tag, so it is a text
    if ($Node->tagName == null)
        return $Text.$Node->textContent;

    // You may select a tag here
    // Like:
    // if (in_array($TextName, $TagWhiteList)) 
    //     DoSomthingWithIt($Text,$Node);

    // Recursive to child
    $Node = $Node->firstChild;
    if ($Node != null)
        $Text = getTextFromNode($Node, $Text);

    // Recursive to sibling
    while($Node->nextSibling != null) {
        $Text = getTextFromNode($Node->nextSibling, $Text);
        $Node = $Node->nextSibling;
    }
    return $Text;
}

function getTextFromDocument($DOMDoc) {
    return getTextFromNode($DOMDoc->documentElement);
}

使用:

$Doc = new DOMDocument();
$Doc->loadHTMLFile("Test.html");

$Text = getTextFromDocument($Doc); echo "Text from HTML: ".$Text."\n";

以上功能是如何剥离标签。但是你可以稍微修改它来操纵元素。例如,如果标记是archor的“a”,则可以提取其目标并显示它而不是内部文本。

希望得到这个帮助。

答案 4 :(得分:0)

如果您没有某种请求&lt; - &gt;类映射,则可以使用DOM extension提取信息。属性textConent包含上下文节点及其后代的所有文本。

$sr = '<?xml version="1.0"?>
<SOAP:Envelope xmlns:SOAP="urn:schemas-xmlsoap-org:soap.v1">
  <SOAP:Body>
    <foo:bar xmlns:foo="urn:yaddayadda">
       <fragment>
         <a href="....">Mary</a> had a
         little <a href="....">lamb</a>
       </fragment>
    </foo:bar>
  </SOAP:Body>
</SOAP:Envelope>';

$doc = new DOMDocument;
$doc->loadxml($sr);

$xpath = new DOMXPath($doc);
$ns = $xpath->query('//fragment');
if ( 0 < $ns->length ) {
  echo $ns->item(0)->nodeValue;
}

打印

Mary had a
little lamb