Использовать xPath или Regex? - PullRequest
       0

Использовать xPath или Regex?

5 голосов
/ 30 октября 2010

Два нижеприведенных метода служат одной и той же цели: отсканировать содержимое сообщения и определить, имеет ли хотя бы один тег img атрибут alt, который содержит ключевое слово, которое проверяется.

Я новичок в xPath и предпочел бы использовать его в зависимости от того, насколько дорог этот подход по сравнению с версией регулярного выражения ...

Метод № 1 использует preg_match

function image_alt_text_has_keyword($post)
        {
            $theKeyword = trim(wpe_getKeyword($post));
            $theContent = $post->post_content;
            $myArrayVar = array();
            preg_match_all('/<img\s[^>]*alt=\"([^\"]*)\"[^>]*>/siU',$theContent,$myArrayVar);
            foreach ($myArrayVar[1] as $theValue)
            {
                if (keyword_in_content($theKeyword,$theValue)) return true;
            }
            return false;
        }

function keyword_in_content($theKeyword, $theContent)
        {
            return preg_match('/\b' . $theKeyword . '\b/i', $theContent);
        }

Метод № 2 использует xPath

function keyword_in_img_alt()
{
global $post;
$keyword = trim(strtolower(wpe_getKeyword($post)));
$dom = new DOMDocument;
$dom->loadHTML(strtolower($post->post_content));
$xPath = new DOMXPath($dom);
return $xPath->evaluate('count(//a[.//img[contains(@alt, "'.$keyword.'")]])');
}

Ответы [ 2 ]

14 голосов
/ 30 октября 2010

Если вы анализируете XML, вы должны использовать XPath, так как он был разработан именно для этой цели.XML / XHTML не является регулярным языком и не может быть правильно проанализирован регулярными выражениями.Возможно, вам удастся написать регулярное выражение, которое иногда будет работать, но в некоторых случаях оно будет неудачным.

4 голосов
/ 30 октября 2010

Использование RegEx для выбора узлов в XML-документе также уместно, как и его использование для определения, является ли данное число простым числом.

Тот факт, что это возможно , неНе делайте это даже немного уместным .

Более того, XPath 2.0 имеет поддержку RegEx , тогда как RegEx не поддерживают XPath.Поэтому, если оба необходимы, вероятно, лучше использовать XPath 2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...