我需要抓住带有特定标签的标签内的文字 在其中包含已检查无线电输入的类。
这是HTML:
<div id="ships-from2">
<label for="ship_hk_intl">
<input type="radio" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/" value="hk_intl">
Hong Kong Warehouse - USD44.31
</label>
<label for="ship_us_intl">
<input type="radio" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked value="us_intl">
United States Warehouse - USD45.10
</label>
</div>
。
我需要:
带有选中单选按钮的标签内的字符串。
实际的单选按钮可能会改变,所以我需要检查哪一个被检查
我正在抓dom并使用xpath但不知道如何编写查询 任何想法?
编辑1 - 代码很快(对@TimDev的回应):
$div = $dom->getElementById('ships-from2');
$query = '//input[@checked]/../text()';
$e = $xpath->query($query, $div);
echo 'TEST:'.trim($e->item(1)->nodeValue);
答案 0 :(得分:1)
您可能需要稍微调整一下查询,但它会返回无线电输入字段,您可以轻松检查所需的属性。
$html='
<div id="ships-from2">
<label for="ship_hk_intl">
<input type="radio" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/" value="hk_intl">
Hong Kong Warehouse - USD44.31
</label>
<label for="ship_us_intl">
<input type="radio" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked value="us_intl">
United States Warehouse - USD45.10
</label>
</div>';
$dom=new DOMDocument;
$dom->loadHTML( $html );
$xpath=new DOMXPath( $dom );
$col=$xpath->query('//label/input');
foreach( $col as $node ) if( $node->hasAttribute('checked') ) {
echo $node->getAttribute('value').' '.$node->parentNode->nodeValue;
}
$dom=null;
$xpath=null;
答案 1 :(得分:1)
使用xpath你可以这样做
//input[@checked]/..
获取文字
//input[@checked]/../text()
function test(field) {
console.log(field.parentElement.innerText);
}
&#13;
<div id="ships-from2">
<label for="ship_hk_intl">
<input type="radio" onchange="test(this)" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/" value="hk_intl">
Hong Kong Warehouse - USD44.31
</label>
<label for="ship_us_intl">
<input type="radio" onchange="test(this)" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked value="us_intl">
United States Warehouse - USD45.10
</label>
</div>
&#13;
答案 2 :(得分:0)
我不确定为什么raghavendra会提供javascript,但这是一个PHP示例。
他正确使用//input[@checked]/../text()
。
注意: ../text()
返回两项文字。它返回所有 input
节点的周围文本。这也是<label>
和<input>
之间的空格。
这就是为什么在下面的代码段中我们得到了$e->item(1)->nodeValue
$html = <<<EOC
<div>
More HTML!
</div>
<div>
Even more HTML!
</div>
<div id="ships-from2">
<label for="ship_hk_intl">
<input type="radio" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/"
value="hk_intl"/>
Hong Kong Warehouse - USD44.31
</label>
<label for="ship_us_intl">
<input type="radio" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked
value="us_intl"/>
United States Warehouse - USD45.10
</label>
</div>
EOC;
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpathObject = new DOMXPath($doc);
$div = $doc->getElementById('ships-from2');
$query = '//input[@checked]/../text()';
$e = $xpathObject->query($query, $div);
echo trim($e->item(1)->nodeValue);
答案 3 :(得分:-2)
首先,它不是有效的XML。每个属性都必须有一个值,所以替换
...data-action="http://www.example.com/" checked value="us_intl">
与
ata-action="http://www.example.com/" checked="true" value="us_intl" />
然后您的xpath将如下所示:
//input[@checked="true" and @id="ship_us_intl"]