Escaped URLs are not found
GigiSan opened this issue ยท 4 comments
Hello everyone,
Since v4 it looks like escaped URLs are not found properly.
Consider a row with this value:
{"action":"console","days":90,"prev":{"country":"all","profile":"https:\/\/testdomain.com\/"}}
If I just search for testdomain.com
and replace it with anotherdomain.com
, this row gets found correctly.
But if I have to replace the full URL because, for example, I have to change protocol and turn https:\/\/testdomain.com
into http:\/\/anotherdomain.com
, the search string is not found in this case.
Some more deatils on the matter:
- I'm a long time SRDB user and I'm 100% sure this wasn't an issue in v3
- I'm currently on PHP 7.4.19 and SRDB v4.1.3
- The behavior mentioned above is the same for both GUI and CLI
If you need any further info please let me know.
Meanwhile, thanks in advance for your time and have a nice day!
Regards,
-Gigi
same problem for me
We can replicate the issue also - any url containing a '/' or '' is no longer found in version 4
UPDATE: The web version seems to have some problems with the '/' delimiters it prepends/appends to the regex, I actually modified those to '#' in the srdb code.
I have found a temporary solution, maybe even permanent for me, which is using regex, as regex search-replace doesn't seem to be affected by the problem.
I will give you the example I used, in case someone has a similar requirement:
Search:
(http(s)?)((\:\/\/)|(\:\\\/\\\/)|((\:|\%3A)\%2F\%2F))(testdomain\.com)
(check use regex, then Case insensitive and Multiline flags)
Replace:
http$3anotherdomain.com
This will replace:
https://testdomain.com
http://testdomain.com
https:\/\/testdomain.com
http:\/\/testdomain.com
https:%2F%2Ftestdomain.com
http:%2F%2Ftestdomain.com
https%3A%2F%2Ftestdomain.com
http%3A%2F%2Ftestdomain.com
respectively with:
http://anotherdomain.com
http://anotherdomain.com
http:\/\/anotherdomain.com
http:\/\/anotherdomain.com
http:%2F%2Fanotherdomain.com
http:%2F%2Fanotherdomain.com
http%3A%2F%2Fanotherdomain.com
http%3A%2F%2Fanotherdomain.com
Which makes WordPress sites imported locally work flawlessly no matter how many plugins there are.
You can find an explanation of the regex HERE. Hope this helps someone while a solution is found.
@GigiSan solution works great! The tricky part is to pass regex that complex from bash script level. I've wrote a simple function which is responsible for running search-and-replace from command line
First argument is old url we want to replace, second the new one and third the protocol (http or https) we want to start using.
run_replace() {
existing_domain="$1"
new_domain="${2}"
new_protocol="${3}"
srdb_root_path='/usr/local/lib/search-and-replace'
if echo $PHP_VERSION | grep -q '5.6' || echo $PHP_VERSION | grep -q '7.1'; then
srdb_path="${srdb_root_path}/3.1"
else
srdb_path="${srdb_root_path}/4.1"
fi
# regex from: https://github.com/interconnectit/Search-Replace-DB/issues/365
php "${srdb_path}/srdb.cli.php" \
--host $MYSQL_HOSTNAME \
--user $MYSQL_USERNAME \
--pass $MYSQL_PASS \
--port $MYSQL_PORT \
--name $MYSQL_DATABASE \
--search "#$(echo '(http(s)?)((\\:\\/\\/)|(\\:\\\\\\/\\\\\\/)|((\\:|\\%3A)\\%2F\\%2F))('"$(echo $existing_domain | sed 's|\.|\\\\\.|g')"')')#" \
--replace $(echo $new_protocol'$3'$new_domain) \
--debug --verbose --regex
}