好的我必须解析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标记而不是特定字段。
答案 0 :(得分:3)
PHP具有strip_tags()
功能。
或者,您可以将filter_var()
与FILTER_SANITIZE_STRING
一起使用。
无论你做什么,都不会用正则表达式解析HTML / XML。它真的很容易出错并且很脆弱。 PHP标准至少有3种不同的解析器(SimpleXML
,DOMDocument
和XMLReader
。{/ 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