Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

regex matches in php, but not in javascript

I have the folowing text

00:00:01.000 --> 00:00:02.000
ALFRED, NOČNI ČUVAJ

and with this regex:

/(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})/

and a bit of code:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

<?php

$line = "00:00:01.000 --> 00:00:02.000\r\nALFRED, NOČNI ČUVAJ";
$pattern1 = '(\d{2}):(\d{2}):(\d{2})\.(\d{3})';

$m1 = preg_match("/^$pattern1/", $line);
if (is_numeric($m1) && $m1 > 0)
{
    echo preg_replace("/$pattern1/", '$1:$2:$3,$4', $line);
}

I am matching: 00:00:01.000 –> 00:00:02.000 and replacing it with 00:00:01,000 –> 00:00:02,000

so at the end I get this out

00:00:01,000 --> 00:00:02,000
ALFRED, NOČNI ČUVAJ

it all works fine in php, example: https://www.tehplayground.com/nZkox8mkNVaC3hW6

the problem is when I got to javascript and want to do the same thing (same regex patern (even https://regexr.com/ confirned that the patern does match 00:00:01.000 –> 00:00:02.000)

function preg_match(pattern, str) {
  var _flag = pattern.substr(pattern.lastIndexOf(pattern[0]) + 1),
    _pattern = pattern.substr(1, pattern.lastIndexOf(pattern[0]) - 1);
  return (new RegExp(_pattern, _flag)).test(str);
}
/**
 * preg_replace (from PHP) in JavaScript!
 *
 * This is basically a pattern replace. You can use a regex pattern to search and 
 * another for the replace. For more information see the PHP docs on the original 
 * function (http://php.net/manual/en/function.preg-replace.php), and for more on 
 * JavaScript flavour regex visit http://www.regular-expressions.info/javascript.html
 *
 * NOTE: Unlike the PHP version, this function only deals with string inputs. No arrays.
 *
 * @author  William Duyck <fuzzyfox0@gmail.com>
 * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License 2.0
 * 
 * @param   {String}    pattern The pattern to search for.
 * @param   {String}    replace The string to replace.
 * @param   {String}    subject The string to search and replace.
 * @param   {Integer}   limit   The maximum possible replacements.
 * @return  {String}    If matches are found, the new subject will be returned.
 */
var preg_replace = function(pattern, replace, subject, limit) {
  if (limit === undefined) {
    limit = -1;
  }

  var _flag = pattern.substr(pattern.lastIndexOf(pattern[0]) + 1),
    _pattern = pattern.substr(1, pattern.lastIndexOf(pattern[0]) - 1),
    reg = new RegExp(_pattern, _flag),
    rs = null,
    res = [],
    x = 0,
    y = 0,
    rtn = subject;

  var tmp = [];
  if (limit === -1) {
    do {
      tmp = reg.exec(subject);
      if (tmp !== null) {
        res.push(tmp);
      }
    } while (tmp !== null && _flag.indexOf('g') !== -1);
  } else {
    res.push(reg.exec(subject));
  }
  for (x = res.length - 1; x > -1; x--) {
    tmp = replace;

    for (y = res[x].length; y > -1; y--) {
      tmp = tmp.replace('${' + y + '}', res[x][y])
        .replace('$' + y, res[x][y])
        .replace('\\' + y, res[x][y]);
    }
    rtn = rtn.replace(res[x][0], tmp);
  }
  return rtn;
};

line = "00:00:01.000 --> 00:00:02.000\r\nALFRED, NOČNI ČUVAJ";
pattern1 = '(\\d{2}):(\\d{2}):(\\d{2})\.(\\d{3})';

m1 = preg_match("/^" + pattern1 + "/", line);
if (m1) {
  console.log(preg_replace("/" + pattern1 + "/", '$1:$2:$3,$4', line));
}

Example: https://jsfiddle.net/a2mzkhew/

as you can see I get this out

00:00:01,000 --> 00:00:02.000
ALFRED, NOČNI ČUVAJ

as you can see only first word (00:00:01,000) til –> is matched, the other one (00:00:02.000) is not

What am I doing wrong that I have so diferent results if I swich languages (I tried to make things as similar as possible (even replicating regex_match and regex_replace in javascript) so this will not happen

Thanks for Anwsering

>Solution :

You are not searching for more than one match. Adding g to your regular expression will make it do both replacements

function preg_match(pattern, str) {
  var _flag = pattern.substr(pattern.lastIndexOf(pattern[0]) + 1),
    _pattern = pattern.substr(1, pattern.lastIndexOf(pattern[0]) - 1);
  return (new RegExp(_pattern, _flag)).test(str);
}
var preg_replace = function(pattern, replace, subject, limit) {
  if (limit === undefined) {
    limit = -1;
  }

  var _flag = pattern.substr(pattern.lastIndexOf(pattern[0]) + 1),
    _pattern = pattern.substr(1, pattern.lastIndexOf(pattern[0]) - 1),
    reg = new RegExp(_pattern, _flag),
    rs = null,
    res = [],
    x = 0,
    y = 0,
    rtn = subject;

  var tmp = [];
  if (limit === -1) {
    do {
      tmp = reg.exec(subject);
      if (tmp !== null) {
        res.push(tmp);
      }
    } while (tmp !== null && _flag.indexOf('g') !== -1);
  } else {
    res.push(reg.exec(subject));
  }
  for (x = res.length - 1; x > -1; x--) {
    tmp = replace;

    for (y = res[x].length; y > -1; y--) {
      tmp = tmp.replace('${' + y + '}', res[x][y])
        .replace('$' + y, res[x][y])
        .replace('\\' + y, res[x][y]);
    }
    rtn = rtn.replace(res[x][0], tmp);
  }
  return rtn;
};

line = "00:00:01.000 --> 00:00:02.000\r\nALFRED, NOČNI ČUVAJ";
pattern1 = '(\\d{2}):(\\d{2}):(\\d{2})\.(\\d{3})';

m1 = preg_match("/^" + pattern1 + "/g", line);
if (m1) {
  console.log(preg_replace("/" + pattern1 + "/g", '$1:$2:$3,$4', line));
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading