]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Fix metadata extract regex (2) 1665/head
authorArthurHoaro <arthur@hoa.ro>
Thu, 17 Dec 2020 12:56:24 +0000 (13:56 +0100)
committerArthurHoaro <arthur@hoa.ro>
Thu, 17 Dec 2020 12:56:24 +0000 (13:56 +0100)
Reference: https://stackoverflow.com/questions/8055727/negating-a-backreference-in-regular-expressions

Fixes #1656

application/bookmark/LinkUtils.php
tests/bookmark/LinkUtilsTest.php

index d65e97ed47ca9163bb8f0f9feef66969b1981166..0ab2d2138c5a01f620744dfac40e091ddd3aadaa 100644 (file)
@@ -68,11 +68,13 @@ function html_extract_tag($tag, $html)
     $properties = implode('|', $propertiesKey);
     // We need a OR here to accept either 'property=og:noquote' or 'property="og:unrelated og:my-tag"'
     $orCondition  = '["\']?(?:og:)?' . $tag . '["\']?|["\'][^\'"]*?(?:og:)?' . $tag . '[^\'"]*?[\'"]';
+    // Support quotes in double quoted content, and the other way around
+    $content = 'content=(["\'])((?:(?!\1).)*)\1';
     // Try to retrieve OpenGraph tag.
-    $ogRegex = '#<meta[^>]+(?:' . $properties . ')=(?:' . $orCondition . ')[^>]*content=(["\'])([^\1]*?)\1.*?>#';
+    $ogRegex = '#<meta[^>]+(?:' . $properties . ')=(?:' . $orCondition . ')[^>]*' . $content . '.*?>#';
     // If the attributes are not in the order property => content (e.g. Github)
     // New regex to keep this readable... more or less.
-    $ogRegexReverse = '#<meta[^>]+content=(["\'])([^\1]*?)\1[^>]+(?:' . $properties . ')=(?:' . $orCondition . ').*?>#';
+    $ogRegexReverse = '#<meta[^>]+' . $content . '[^>]+(?:' . $properties . ')=(?:' . $orCondition . ').*?>#';
 
     if (
         preg_match($ogRegex, $html, $matches) > 0
index ddab4e3caebd0e7070273738054f9f58d0821aa0..46a7f1fe7a4fd42b749bee30bd455d41ccdc107a 100644 (file)
@@ -245,6 +245,16 @@ class LinkUtilsTest extends TestCase
         $this->assertFalse(html_extract_tag('description', $html));
     }
 
+    public function testHtmlExtractDescriptionFromGoogleRealCase(): void
+    {
+        $html = 'id="gsr"><meta content="Fêtes de fin d\'année" property="twitter:title"><meta '.
+                'content="Bonnes fêtes de fin d\'année ! #GoogleDoodle" property="twitter:description">'.
+                '<meta content="Bonnes fêtes de fin d\'année ! #GoogleDoodle" property="og:description">'.
+                '<meta content="summary_large_image" property="twitter:card"><meta co'
+        ;
+        $this->assertSame('Bonnes fêtes de fin d\'année ! #GoogleDoodle', html_extract_tag('description', $html));
+    }
+
     /**
      * Test the header callback with valid value
      */