Validating latitude/longitude in Laravel validation regex rule - preg_match(): No ending delimiter '/' found

Latheesan picture Latheesan · Nov 8, 2017 · Viewed 10.3k times · Source

I am trying to validate latitude/longitude in Laravel 5.4 project with custom regex rule (based on this answer: https://stackoverflow.com/a/22007205/2332336)

// Create validation
$validator = Validator::make($request->all(), [
    // ...
    'lat' => 'required|regex:/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/',
    'long' => 'required|regex:/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/'
], [
    'lat.regex' => 'Latitude value appears to be incorrect format.',
    'long.regex' => 'Longitude value appears to be incorrect format.'
]);

// Test validation
if ($validator->fails()) {
    return redirect()
        ->back()
        ->withErrors($validator)
        ->withInput();
}

When this runs, I am getting the following error:

preg_match(): No ending delimiter '/' found

I've tried this also;

    'lat' => 'required|regex:^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$',
    'long' => 'required|regex:^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$'

Now I get this error:

preg_match(): No ending delimiter '^' found

What is the correct syntax to validate lat/lng in laravel via custom regex rule?

Answer

Martin Cook picture Martin Cook · Nov 8, 2017

Is it possible that the pipes are the problem? See, for example, Laravel 5.4 - Validation with Regex. I see that your regexp has a pipe character in it. Try separating the rules into an array instead of using the pipe here: required|regex

In the second example, the first ^ is interpreted as the character that starts the regex string, so it expects a final ^ to match it.