Create a gist now

Instantly share code, notes, and snippets.

PHP: Text Spinner Class - Nested spinning supported.
<?PHP
/**
* Spintax - A helper class to process Spintax strings.
* @name Spintax
* @author Jason Davis - https://www.codedevelopr.com/
* Tutorial: https://www.codedevelopr.com/articles/php-spintax-class/
*/
class Spintax
{
public function process($text)
{
return preg_replace_callback(
'/\{(((?>[^\{\}]+)|(?R))*)\}/x',
array($this, 'replace'),
$text
);
}
public function replace($text)
{
$text = $this->process($text[1]);
$parts = explode('|', $text);
return $parts[array_rand($parts)];
}
}
/* EXAMPLE USAGE */
$spintax = new Spintax();
$string = '{Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {Smith|Williams|Davis}!';
echo $spintax->process($string);
/* NESTED SPINNING EXAMPLE */
echo $spintax->process('{Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {{Jason|Malina|Sara}|Williams|Davis}');
@ranggacyber

it's pretty cool .. many thanks

@salvatorecapolupo

Interesting, thank you

@NealWalters

Nice short code! Can you help explain the regex pattern: /{(((?>[^{}]+)|(?R))*)}/x
I'm trying to rewrite in Powershell/.NET. Especially, what is the ?R

@lury
lury commented Mar 7, 2015

@NealWalters here you go:

/
  \{                    # opening curly ({) bracket
  (                     # group $1
    (                   # group $2
      (?>               # group $3
                        # Atomic group - Matches the longest possible substring in the group and doesn't allow later backtracking to reevaluate the group.
        [^\{\}]+        # one or more characters which are not "{" or "}"
      )
      |                 # or
      (?R)              # recursive match on the pattern itself - next nesting level of {}
    )*                  # zero or more times
  )
  \}                    # ended with curly (}) bracket
/x                      # PCRE_EXTENDED - whitespaces are ignored, # means comments
@soulfreeza

thank you, anyway is it possible for making this spin work if only for first opening file and not working after it has been refresh ?

@erm3nda
erm3nda commented Jul 5, 2015

Perfectly working. Thank you so much for the explanation about the regexp.
Regexp are really cool, but not so easy to understand/explain, also has a really HUGE syntax :)

@ghprod
ghprod commented Sep 19, 2015

Simple but powerful :)

Thanks

@cantrikndelik

[ask] it is possible to spin the title also ?

@dev-masta
dev-masta commented Apr 21, 2016 edited

If you want to use the [square|brackets|syntax] use this line in the process function:

'/\[(((?>[^\[\]]+)|(?R))*)\]/x',

thanks @lury

@surioseo
surioseo commented May 25, 2016 edited

thank you i creat for bàn là tefal spin content

@duytanqb
duytanqb commented Aug 1, 2016

Thank for very helpful code.
How can I use PHP to find match text in data then replace
example my content:
$content = 'The speedy black wolf bounded over the lazy hound';
$patten = array('{the|a|}',{black|red|yellow}....);

Expect result after replace : $content = '{the|a|} speedy {black|red|yellow} wolf bounded over the lazy hound';
they will find 1 of some word in {} and if 1 of some word by | match, they will replace to the content.

@b3rday
b3rday commented Aug 3, 2016

thank you for this

@verma-ashish

Is there way to ignore spin for "first capital alphabet word" (e,g. names, country, etc.)?

@iznubadd
iznubadd commented Mar 20, 2017 edited

hi
i love this scripts. is any ideas on how can it be implement with mysql data? like storing the synonyms in a database

more power

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment