-1

I found this query on GITHUB https://gist.github.com/matoakley/1092571 that converts strings into slugs, but I'm having problems when string contains EM and EN dashes, need help with this:

SELECT *, LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(name), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '\/', ''), '\\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-')) as slug FROM program

SQL FIDDLE: http://sqlfiddle.com/#!9/511cc73/1

Result: arrival-–-free-time-or-optional-activities

Need this Result: arrival-free-time-or-optional-activities

Ered
  • 465
  • 1
  • 6
  • 23

2 Answers2

2

Reg_replace makes the query easier, so that you don_#t need for every pattern to add a new replace

Query 1:

-- based on answer https://stackoverflow.com/a/7745635/808921

SELECT *, LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(name), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '\/', ''), '\\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-'), '-–-', '-')) as slug FROM program

Results:

| id |                                                                name |                                                            slug |
|----|---------------------------------------------------------------------|-----------------------------------------------------------------|
|  1 |                          Arrival – Free time or optional activities |                        arrival-free-time-or-optional-activities |
|  2 | Amazon Adventure: Jondachi canyon hike – Explore underground caves  | amazon-adventure-jondachi-canyon-hike-explore-underground-caves |
|  3 |                                                      Day 1 Explorer |                                                  day-1-explorer |
nbk
  • 45,398
  • 8
  • 30
  • 47
1
mysql> select *, lower(regexp_replace(trim(name), '[^[:alnum:]]+', '-')) as slug from program\G
*************************** 1. row ***************************
  id: 1
name: Arrival – Free time or optional activities
slug: arrival-free-time-or-optional-activities
*************************** 2. row ***************************
  id: 2
name: Amazon Adventure: Jondachi canyon hike – Explore underground caves 
slug: amazon-adventure-jondachi-canyon-hike-explore-underground-caves
*************************** 3. row ***************************
  id: 3
name: Day 1 Explorer
slug: day-1-explorer

Tested on MySQL 8.0.32. The REGEXP_REPLACE() function is not implemented in earlier versions of MySQL.

Bill Karwin
  • 538,548
  • 86
  • 673
  • 828