正则表达式 - php - 获取空格不在前面,后面没有单词

Having something like this:

'This or is or some or information or stuff or attention here or testing' 

I want to capture all the [spaces] that aren't preceded nor followed by the word or.

I reached this, I think I'm on the right track.

/\s(?<!(\bor\b))\s(?!(\bor\b))/

or this

/(?=\s(?<!(\bor\b))(?=\s(?!(\bor\b))))/

I'm not getting all the spaces, though. What is wrong with this? (the second one was a tryout to get the "and" going")

Try this:

<?php
    $str = 'This or is or some or information or stuff or attention is   not here or testing';
    $matches = null;
    preg_match_all('/(?<!\bor\b)[\s]+(?!\bor\b)/', $str, $matches);
    var_dump($matches);
?>

How about (?<!or)\s(?!or):

$str='This or is or some or information or stuff or attention here or testing';
echo preg_replace('/(?<!or)\s(?!or)/','+',$str); 

>>> This or is or some or information or stuff or attention+here or testing

This uses negitive lookbehind and lookahead, this will replace the space in Tor operator for example so if you want to match only or add trailing and preceding spaces:

$str='Tor operator';
echo preg_replace('/\s(?<!or)\s(?!or)\s/','+',$str); 

>>> Tor operator

Code: (PHP Demo) (Pattern Demo)

$string = "You may organize to find or seek a neighbor or a pastor in a harbor or orchard.";
echo preg_replace('~(?<!\bor) (?!or\b)~', '_', $string);

Output:

You_may_organize_to_find or seek_a_neighbor or a_pastor_in_a_harbor or orchard.

Effectively the pattern says:

Match every space IF:

  1. the space is not preceded by the full word "or" (a word that ends in "or" doesn't count), and
  2. the space is not followed by the full word "or" (a word that begins with "or" doesn't count)