[pmwiki-users] attachtable for PHP 5.5 ?

Petko Yotov 5ko at 5ko.fr
Tue Dec 9 15:47:24 CST 2014

This one is more advanced indeed, here is how to use it so that the code 
is compatible with both PHP 5.5 and PHP 4.

First, instead of preg_replace() with arguments arrays, we use the 
built-in PPRA() function which will call intelligently preg_replace() or 
preg_replace_callback() for every element of the arrays:

   if ($pg) $txt = preg_replace( # before
   if ($pg) $txt = PPRA(         # after

First, the search pattern is written without the /e flag:

   '/\[\[[^\]]*?\bAttach:([^"\]\|]*)/e', # before
   '/\[\[[^\]]*?\bAttach:([^"\]\|]*)/',  # after

Second, the replace string is converted into a callback function:

   "'[['.AttachtableCountUploadLinks(\$pn,'','$1')", # before
   PCCF("return '[['.AttachtableCountUploadLinks('$pn','',\$m[1]);"), # 

Note that we have wrapped the previous code in a line like
   PCCF("return PREVCODEHERE ;")

Also, two important changes:

The '$1' is written as \$m[1].

The \$pn variable is EMBEDDED as quoted expanded STRING "...'$pn'..." 
into the code to be evaluated, because as a local variable it would be 
out of the scope of the callback function, thus inaccessible.

So, the last part would probably look like this:

   PCCF("return '[['.AttachtableCountUploadLinks('$pn','',\$m[1]);"),
   PCCF("return AttachtableCountUploadLinks('$pn','',\$m[1]);"),
   PHSC( $pg['text'], ENT_NOQUOTES ) );

(untested, might need some tweaking)

PCCF="PmWiki Create Callback Function", see/improve
   http://www.pmwiki.org/wiki/PmWiki/Functions (documentation)
   http://www.pmwiki.org/wiki/Cookbook/ROSPatterns (example)

PPRA="PmWiki preg replace array", see/improve
   http://www.pmwiki.org/wiki/PmWiki/Functions (documentation)
   http://www.pmwiki.org/wiki/Cookbook/DotsInLinks (example, also PCCF)


On 09.12.2014 15:08, Hans Bracker wrote:
> I  tried  to  update  the  attachtable.php  script, to make it PHP 5.5
> compatible. But I could not get the following section (lines 174-186)
> revise dfor PHP 5.5 compatibility:
> foreach( $ls as $pn ) {
>   $pg = RetrieveAuthPage( $pn, 'read', FALSE, READPAGE_CURRENT );
>   if ($pg) $txt = preg_replace(
>     array(
>       "/(\n[^\\S\n]*)?\\[([=@])(.*?)\\2\\]/s",        ## preserved text
>       '/\[\[[^\]]*?\bAttach:([^"\]\|]*)/e',           ## links to 
> attachments
> "/\\bAttach:([^\\s$UrlExcludeChars]*[^\\s.,?!$UrlExcludeChars])/e" ),
>  ## raw attachments
>    array(
>       ' ',
>       "'[['.AttachtableCountUploadLinks(\$pn,'','$1')",
>       "AttachtableCountUploadLinks(\$pn,'','$1')" ),
>       htmlspecialchars( $pg['text'], ENT_NOQUOTES ) );        ##
> assumes $MarkupFrame[0]['escape'] == 1
> }
> How  can  this  be  rewritten?  preg_replace  with /e modifier is used
> twice, and I don't know how to create correct preg_replace_callback
> or use PPRA or PPRE instead. I tried in various ways and get warnings,
> and  the  Attach:  markup in links or otherwise is not picked up (when
> the list of pages gets larger than 8).
> Best regards,
>  Hans
> mailto:design at softflow.co.uk
> www.softflow.co.uk
> _______________________________________________
> pmwiki-users mailing list
> pmwiki-users at pmichaud.com
> http://www.pmichaud.com/mailman/listinfo/pmwiki-users

More information about the pmwiki-users mailing list