xpathが最初と最後の子に一致する

Pタグテキストが完全に強い/ Bタグ内にあるかどうかを判断しよう

// Match (unacceptable, flag to user):

Any text and maybe other tags

// Don't match (acceptable):

Any text and maybe other tags

2
string(// p) string(// p/strong)を比較できます。
追加された 著者 gangabass,

4 答え

  • Any p ...
    //p
  • with at least one strong descendant node ...
    //p[.//strong]
  • that has some text content other then just whitespaces ...
    //p[.//strong[normalize-space(.) != ""]]
  • and no text node descendant with content that has no strong ancestor node:

    //p[
      .//strong[normalize-space(.) != ""] and 
      not(.//text()[normalize-space(.) != "" and not(ancestor::strong)])
    ]
    

これは2つの条件をチェックします。まず、段落に strong の内側にある実際のコンテンツがあり、 strong の内側にない実際のコンテンツはありません。つまり、別の形式のコンテンツです。

例:

$html = <<<'HTML'

Any text and maybe other tags

Any text and maybe other tags

Builder's tea

Builder's tea

HTML; $document = new DOMDocument(); $document->loadHTML($html); $xpath = new DOMXpath($document); $expression = '//p[ .//strong[normalize-space(.) != ""] and not(.//text()[normalize-space(.) != "" and not(ancestor::strong)]) ]'; foreach ($xpath->evaluate($expression) as $p) { var_dump( $document->saveXml($p) ); }

出力:

string(75) "

Any text and maybe other tags

" string(54) "

Builder's tea

" string(64) "

Builder's tea

"

式は b もカバーするように拡張できます。

//p[
   (
     .//strong[normalize-space(.) != ""] or
     .//b[normalize-space(.) != ""]
   ) and 
   not(
     .//text()[
       normalize-space(.) != "" and 
       not(ancestor::*[self::strong or self::b])
     ]
   )
]
1
追加された

Here's one way, partly based on @gangabass' suggestion. It counts the

elements that only contain a single element that are optionally only surrounded by whitespace text.

$unacceptableNodesCount = $xpath->evaluate( 'count(//p[count(*) = 1 and name(*) = "strong" and normalize-space() = string(strong)])' );

var_dump( $unacceptableNodesCount );

To be honest though, if the goal is to prevent your users from using merely bold text and your users are determined, they'll probably find a way. For instance by surrounding the element with Unicode whitespace chars, or something similar.

0
追加された
ユーザーが決まっているわけではありません。代わりに、通常は怠惰な(または知らない)。 Web CMSはTinyMCEテキストエディタを使用しています。ユーザーは、実際には正しい見出しタグを使用せずに、見出しに太字のテキストを使用して、Word文書からコンテンツを貼り付けます。私は与えられたテキストのSEOレポートを書いています。ユーザが太字の段落ではなくTinyMCEエディタによって与えられた正しい見出しスタイルを使うべきであることを示すフラグ。段落内の太字のテキストの小さなセクションは、もちろん受け入れられます。
追加された 著者 Christopher Aitken,

あなたの問題の説明はあなたも捕まえたいことを示唆しています

Builder's tea

そしておそらくまた

Builder's tea

これはいくつかの提案された解決策によってつかまえられない。

しかし、あなたも捕まえたいのかどうかは明らかではありません

Builder's tea

XPath 2.0では、「任意のPタグテキストは完全に強い/ Bタグ内にある」に最も近いと思います。

//p[empty(.//text()[normalize-space()] except .//strong//text()])]

これは、p内の強い要素の子孫ではない、非白の子孫テキストノードを持たないすべてのp要素を選択します。

私はすぐにXPath 1.0でこれを行う方法を見ることはできませんが、私のXPath 1.0は非常に錆びています。

0
追加された

次のコードでは、Pタグの前後にテキストや他のHTMLタグが含まれていないことを確認し、Pタグが完全に太字(強い)であることを確認します。

$false_headings = $xpath->query("//p/strong");

foreach ($false_headings as $heading) {
    if ($heading->previousSibling === null and $heading->nextSibling === null) {
       //Report to user 
        break;
    }
}
0
追加された
このコードスニペットは問題を解決するかもしれませんが、説明を含むは改善に役立ちます。投稿の質あなたは将来読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
追加された 著者 31piy,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com