Is it possible to convert plain text array to an unordered list? I have a front end form with checkboxes which submits the data as an array into a plain text field in craft (named logGeneral_logInputIndications). 

Here's an example of what the content looks in the plain text field in Craft CP:

["Abdominal Pain","RUQ","Vomiting",""]


Instead of outputting the field content in it's default state into my template, I'd like to convert it to an unordered list.  If I were to code it by hand it would look like this:

&lt;ul&gt;
    &lt;li&gt;Abdominal Pain&lt;/li&gt;
    &lt;li&gt;RUQ&lt;/li&gt;
    &lt;li&gt;Vomiting&lt;/li&gt;
&lt;/ul&gt;


Any ideas if it's possible to do this?

(Mats answered the above question and his suggestion worked perfectly.)

However, I just realized that I have checkbox choices that contain non-alphanumeric content like Normal CBD (&lt;0.4cm)  Is there a way to pick and choose which non-alphanumeric content I'd like to strip out vs keep?

Here's a new question that builds upon my initial one...

Is it possible to add a conditional to this?  Some of the text is really a child so it should be inset by another unordered list.  What my initial thought was is that perhaps I could add an identifier to the form input text if it's a child like "•" or something else, and then in the template, use that identifier in a conditional to say if you see "•" indent it and then strip the marker "•".

So then my plain text content would be: 

["Abdominal Pain","•RUQ","Vomiting",""]


And my template code would look like this:

&lt;ul&gt;
    &lt;li&gt;Abdominal Pain&lt;/li&gt;
    &lt;ul&gt;
        &lt;li&gt;RUQ&lt;/li&gt;
    &lt;ul&gt;
    &lt;li&gt;Vomiting&lt;/li&gt;
&lt;/ul&gt;


I was able to combine the suggestion Mats gave me with the following to conditionally indent child items.

{% set listItems = entry.logGeneral_logInputIndications|replace('/[^,()&lt;&gt;• a-zA-Z0-9_-]|[, ]$/s','')|split(',') %}
&lt;ul&gt;
    {% if entry.logGeneral_logInputIndications|length %}
        {% for listItem in listItems %}
            {% if listItem starts with '•' %}
                &lt;ul&gt;&lt;li&gt;{{ listItem|trim|slice(1) }}&lt;/li&gt;&lt;/ul&gt;
            {% else %}
                &lt;li&gt;{{ listItem|trim }}&lt;/li&gt;
            {% endif %}
        {% endfor %}
    {% endif %}
&lt;/ul&gt;
Something like this should work:

{% set listItems = plainTextValue|replace('/[^, a-zA-Z0-9_-]|[, ]$/s','')|split(',') %}

&lt;ul&gt;
  {% for listItem in listItems %}
    {% if listItem|length %}
      &lt;li&gt;{{ listItem|trim }}&lt;/li&gt;
    {% endif %}
  {% endfor %}
&lt;/ul&gt;


What the above does is to first use the replace filter to remove any character that isn't alphanumeric (except spaces and commas), before the resulting string (which would look something like 'Abdominal Pain,RUQ,Vomiting') is split on the commas. The resulting array is stored in a variable listItems. Finally, it's just a matter of looping through that array, to create the &lt;li&gt; items.

Note that in the above example, plainTextValue is a variable containing the string '["Abdominal Pain","RUQ","Vomiting",""]' – so swap that out with entry.logGeneral_logInputIndications, or whatever fits.

Edit (OP added more info to the original question)

If your "symptoms" are in fact hierarchical, I'd suggest not using a PlainText field at all. You're quickly running into a situation where your back-end solution is way too simple, which will make your front-end solution way too complex.

My definitive recommendation would be to create a Categories group for the symptoms, and swap out the PlainText field for a Categories field.

Note that you can still render the actual symptoms form element on the front end as checkboxes, you'd just pass in an array of category IDs instead of a plain text string (the following example assumes a Categories group with the handle symptoms and a Categories field with the handle selectedSymptoms):

{# Get all available symptoms #}
{% set symptoms = craft.categories.group('symptoms').limit(null) %}

{# Get the symptoms that have been selected for this entry earlier #}
{% set selectedSymptoms = entry.selectedSymptoms.ids() %}

{# Loop through the available symptoms, creating checkboxes #}
{% for symptom in symptoms %}
    &lt;input type="checkbox" name="fields[selectedSymptoms][]" value="{{ symptom.id }}"{% if symptom.id in selectedSymptoms %} checked{% endif %} /&gt;{{ symptom.title }}&lt;br /&gt;
{% endfor %}


...and to display whatever symptoms are already selected – in nested lists, as per the category hiearchy, you can use the {% nav %} tag:

&lt;ul&gt;
{% nav symptom in entry.selectedSymptoms %}
    &lt;li&gt;
        {{ symptom.title }}
        {% ifchildren %}
            &lt;ul&gt;
                {% children %}
            &lt;/ul&gt;
        {% endifchildren %}
    &lt;/li&gt;
{% endnav %}
&lt;/ul&gt;