[pmwiki-users] Recipes you use/need to be updated for PHP 5.5

John Rankin john.rankin at affinity.co.nz
Thu Jan 9 19:12:09 CST 2014

On 10/01/14 12:53 PM, Petko Yotov wrote:
> John Rankin writes:
>> On 9/01/14 6:35 PM, Petko Yotov wrote:
>>> John Rankin writes:
>>>> > John Rankin writes:
>>>> >> On 8/01/14 12:31 PM, Petko Yotov wrote:
>>> ...
>>>> > 2. $pagename is not in the scope of the callback function,
>>> ...
>>>> Sorry, I over-simplified. In practice, the $LinkTidy array is 
>>>> defined once
>>>> at the start and then referenced as a global variable several times in
>>>> different places to do the actual tidying. So at the time $LinkTidy is
>>>> defined, the code may not know the $pagename. Potentially, the 
>>>> tidying can
>>>> apply to multiple different $pagename values as it assembles 
>>>> several wiki
>>>> pages into one output.
>>>> Do I use \$pagename instead?
>>> Once again, $pagename is not automatically in the scope of the 
>>> callback function. If you want to use $pagename in the callback, it 
>>> must somehow get into that callback. If it does, yes, when defining 
>>> the callback, use \$pagename.
>> Of course; you said that before. Stupid me. Apologies.
> John,
> I'm sorry if I wrote in a way that offended you. I didn't mean to. 
> English is not my best language, or my second best language, but my 
> third language. Anyone can imagine participating in such a discussion 
> in their third best language.
Not at all -- I was embarrassed, not offended :-)

I have done some experiments and the following code illustrates an 
approach which looks interesting for my needs (note the use (&$pagename) 
in the anonymous function definition, which avoids making it a global 

<?php if (!defined('PmWiki')) exit();

if ($action=='testcallback') {
   header('Content-type: text/plain');

   function isClosure($v) {
     return is_object($v) && ($v instanceof Closure);

   SDVA($TestCleaner, array(
     '/`\..*?$/' => '...',
     "/\\[\\[([^|\\]]+)\\|\\s*(.*?)\\]\\]($SuffixPattern)/" =>
       function ($m) use (&$pagename) { return 
MakeLink($pagename,$m[1],$m[2],$m[3],'$LinkText'); },
"/\\[\\[([^\\]]+?)\\s*-+>\\s*(.*?)\\]\\]($SuffixPattern)/" =>
       function ($m) use (&$pagename) { return 
MakeLink($pagename,$m[2],$m[1],$m[3],'$LinkText'); },
     '/\\[\\[#([A-Za-z][-.:\\w]*)\\]\\]/' => "",
     "/\\[\\[(.*?)\\]\\]($SuffixPattern)/" =>
       function ($m) use (&$pagename) { return 
MakeLink($pagename,$m[1],NULL,$m[2],'$LinkText'); },
     "/`(($GroupPattern([\\/.]))?($WikiWordPattern))/" => '$1'

   $testString = "[[#label]]this is [[page name | link text]] to clean, 
plus [[another link -> another page]], and finally some [[test]]s and 
a `WikiWord `.to truncate";
   $pagename = 'Harvard.TestPage';
   foreach ($TestCleaner as $k => $v) {
     $testString = isClosure($v) ? preg_replace_callback($k,$v,$testString)
                                 : preg_replace($k,$v,$testString);
   echo $pagename."\n".$testString;

The output looks right to me, but I haven't tested it on real pages.

It may be useful to have a PCAF($code) function that returns an 
anonymous function using $code, but I can't get this to work.
> Sometimes I write too fast and I miss an important point. For example, 
> now I see that in my messages I was documenting the usage of the new 
> core functions. As a very experienced programmer, you certainly know 
> all this just by reading the functions, and you don't have to use them 
> if you don't want to. There are different ways to perform search and 
> replace in a text string - use those that work when you test them and 
> that suit you best.
> Sorry again,
Thanks. The use of callback is new to me and it has taken a while to get 
my head around it. To me, the anonymous function approach looks cleaner 
and tidier than the create_function approach, but it requires php 5.3 or 


John Rankin

More information about the pmwiki-users mailing list