]> git.mxchange.org Git - friendica.git/commitdiff
regular expressions were grabbing too much
authorZach Prezkuta <fermion@gmx.com>
Sun, 26 Aug 2012 20:56:34 +0000 (14:56 -0600)
committerZach Prezkuta <fermion@gmx.com>
Sun, 26 Aug 2012 20:56:34 +0000 (14:56 -0600)
include/bb2diaspora.php
include/bbcode.php
include/conversation.php

index b0e12027a8d4108eeca346abcfe8fd7cb3d1dbc8..f007417903b2ed7a9367417fc998fc44f3b06665 100644 (file)
@@ -8,65 +8,6 @@ require_once("include/bbcode.php");
 require_once("include/markdownify/markdownify.php");
 
 
-function get_bb_tag_pos($s, $name, $occurance = 1) {
-
-       if($occurance < 1)
-               $occurance = 1;
-
-       $start_open = -1;
-       for($i = 1; $i <= $occurance; $i++) {
-               if( $start_open !== false)
-                       $start_open = strpos($s, '[' . $name, $start_open + 1); // allow [name= type tags
-       }
-
-       if( $start_open === false)
-               return false;
-
-       $start_equal = strpos($s, '=', $start_open);
-       $start_close = strpos($s, ']', $start_open);
-
-       if( $start_close === false)
-               return false;
-
-       $start_close++;
-
-       $end_open = strpos($s, '[/' . $name . ']', $start_close);
-
-       if( $end_open === false)
-               return false;
-
-       $res = array( 'start' => array('open' => $start_open, 'close' => $start_close),
-                     'end' => array('open' => $end_open, 'close' => $end_open + strlen('[/' . $name . ']')) );
-       if( $start_equal !== false)
-               $res['start']['equal'] = $start_equal + 1;
-
-       return $res;
-}
-
-function bb_tag_preg_replace($pattern, $replace, $name, $s) {
-
-       $string = $s;
-
-       $occurance = 1;
-       $pos = get_bb_tag_pos($string, $name, $occurance);
-       while($pos !== false && $occurance < 1000) {
-
-               $start = substr($string, 0, $pos['start']['open']);
-               $subject = substr($string, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
-               $end = substr($string, $pos['end']['close']);
-               if($end === false)
-                       $end = '';
-
-               $subject = preg_replace($pattern, $replace, $subject);
-               $string = $start . $subject . $end;
-
-               $occurance++;
-               $pos = get_bb_tag_pos($string, $name, $occurance);
-       }
-
-       return $string;
-}
-
 // we don't want to support a bbcode specific markdown interpreter
 // and the markdown library we have is pretty good, but provides HTML output.
 // So we'll use that to convert to HTML, then convert the HTML back to bbcode,
@@ -113,7 +54,7 @@ function diaspora2bb($s) {
        //$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
        $s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]','url',$s);
        $s = bb_tag_preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]','url',$s);
-       $s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/     \/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]','url',$s);
+       $s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]','url',$s);
        $s = bb_tag_preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]','url',$s);
        // remove duplicate adjacent code tags
        $s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
index 29ee71d410eb79c52e6d5bc7d1a236d07355559d..6f22d1970257ac9d0f9d4700640c3f3cb4180aa9 100644 (file)
@@ -47,6 +47,65 @@ function bb_unspacefy_and_trim($st) {
   return $unspacefied;
 }
 
+function get_bb_tag_pos($s, $name, $occurance = 1) {
+
+       if($occurance < 1)
+               $occurance = 1;
+
+       $start_open = -1;
+       for($i = 1; $i <= $occurance; $i++) {
+               if( $start_open !== false)
+                       $start_open = strpos($s, '[' . $name, $start_open + 1); // allow [name= type tags
+       }
+
+       if( $start_open === false)
+               return false;
+
+       $start_equal = strpos($s, '=', $start_open);
+       $start_close = strpos($s, ']', $start_open);
+
+       if( $start_close === false)
+               return false;
+
+       $start_close++;
+
+       $end_open = strpos($s, '[/' . $name . ']', $start_close);
+
+       if( $end_open === false)
+               return false;
+
+       $res = array( 'start' => array('open' => $start_open, 'close' => $start_close),
+                     'end' => array('open' => $end_open, 'close' => $end_open + strlen('[/' . $name . ']')) );
+       if( $start_equal !== false)
+               $res['start']['equal'] = $start_equal + 1;
+
+       return $res;
+}
+
+function bb_tag_preg_replace($pattern, $replace, $name, $s) {
+
+       $string = $s;
+
+       $occurance = 1;
+       $pos = get_bb_tag_pos($string, $name, $occurance);
+       while($pos !== false && $occurance < 1000) {
+
+               $start = substr($string, 0, $pos['start']['open']);
+               $subject = substr($string, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
+               $end = substr($string, $pos['end']['close']);
+               if($end === false)
+                       $end = '';
+
+               $subject = preg_replace($pattern, $replace, $subject);
+               $string = $start . $subject . $end;
+
+               $occurance++;
+               $pos = get_bb_tag_pos($string, $name, $occurance);
+       }
+
+       return $string;
+}
+
 if(! function_exists('bb_extract_images')) {
 function bb_extract_images($body) {
 
index 0b091571f1cc6f25ffdd154b6fccf285d9f161db..1fc0642856015b4b0d80f690460662f53547e09a 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+require_once("include/bbcode.php");
+
+
 // Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
 // is identical to the code in mod/message.php for 'item_extract_images' and
 // 'item_redir_and_replace_images'
@@ -51,19 +54,27 @@ function item_redir_and_replace_images($body, $images, $cid) {
        $origbody = $body;
        $newbody = '';
 
-       for($i = 0; $i < count($images); $i++) {
-               $search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
+       $cnt = 1;
+       $pos = get_bb_tag_pos($origbody, 'url', 1);
+       while($pos !== false && $cnt < 1000) {
+
+               $search = '/\[url\=(.*?)\]\[!#saved_image([0-9]*)#!\]\[\/url\]' . '/is';
                $replace = '[url=' . z_path() . '/redir/' . $cid 
-                          . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;
+                          . '?f=1&url=' . '$1' . '][!#saved_image' . '$2' .'#!][/url]';
+
+               $newbody .= substr($origbody, 0, $pos['start']['open']);
+               $subject = substr($origbody, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
+               $origbody = substr($origbody, $pos['end']['close']);
+               if($origbody === false)
+                       $origbody = '';
 
-               $img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
-               $process_part = substr($origbody, 0, $img_end);
-               $origbody = substr($origbody, $img_end);
+               $subject = preg_replace($search, $replace, $subject);
+               $newbody .= $subject;
 
-               $process_part = preg_replace($search, $replace, $process_part);
-               $newbody = $newbody . $process_part;
+               $cnt++;
+               $pos = get_bb_tag_pos($origbody, 'url', 1);
        }
-       $newbody = $newbody . $origbody;
+       $newbody .= $origbody;
 
        $cnt = 0;
        foreach($images as $image) {
@@ -293,10 +304,10 @@ function localize_item(&$item){
        }
 
        // add zrl's to public images
-       if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
-               foreach($matches as $mtch) {
-                               $item['body'] = str_replace($mtch[0],'[url=' . zrl($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3] ,true) . '][img' . $mtch[4] . ']h' . $mtch[5]  . '[/img][/url]',$item['body']);
-               }
+       $photo_pattern = "/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is";
+       if(preg_match($photo_pattern,$item['body'])) {
+               $photo_replace = '[url=' . zrl('$1' . '/photos/' . '$2' . '/image/' . '$3' ,true) . '][img' . '$4' . ']h' . '$5'  . '[/img][/url]';
+               $item['body'] = bb_tag_preg_replace($photo_pattern, $photo_replace, 'url', $item['body']);
        }
 
        // add sparkle links to appropriate permalinks